[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CF6SMKXM9VDW9BB1DZNCEQ":3,"skill-same:01M6CF6SMKXM9VDW9BB1DZNCEQ":100},{"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":28,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":6,"updatedAt":58,"install":59,"resources":72},"01M6CF6SMKXM9VDW9BB1DZNCEQ","google-gemini-media",null,"Use the Gemini API (Nano Banana image generation, Veo video, Gemini TTS speech and audio understanding) to deliver end-to-end multimodal media workflows and code templates for \"generation + understanding\".","sundial-org\u002Fawesome-openclaw-skills","sundial-org","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F225963689?v=4","01M6CEAPGV2C2CVE8A0VCS0XZH","Sundial","01M6CEAPN7KM9TGZMBC07NDY3H",674,"MIT","https:\u002F\u002Fgithub.com\u002Fsundial-org\u002Fawesome-openclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fgoogle-gemini-media\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"google","google gemini media","Media","gemini","gemini api","workflows","code","speech","multimodal","Image Generation","templates","api","Video","Audio","tts","use","image","2026-11-10 10:12:30",false,"---\nname: google-gemini-media\ndescription: Use the Gemini API (Nano Banana image generation, Veo video, Gemini TTS speech and audio understanding) to deliver end-to-end multimodal media workflows and code templates for \"generation + understanding\".\nlicense: MIT\n---\n\n# Gemini Multimodal Media (Image\u002FVideo\u002FSpeech) Skill\n\n## 1. Goals and scope\n\nThis Skill consolidates six Gemini API capabilities into reusable workflows and implementation templates:\n\n- Image generation (Nano Banana: text-to-image, image editing, multi-turn iteration)\n- Image understanding (caption\u002FVQA\u002Fclassification\u002Fcomparison, multi-image prompts; supports inline and Files API)\n- Video generation (Veo 3.1: text-to-video, aspect ratio\u002Fresolution control, reference-image guidance, first\u002Flast frames, video extension, native audio)\n- Video understanding (upload\u002Finline\u002FYouTube URL; summaries, Q&A, timestamped evidence)\n- Speech generation (Gemini native TTS: single-speaker and multi-speaker; controllable style\u002Faccent\u002Fpace\u002Ftone)\n- Audio understanding (upload\u002Finline; description, transcription, time-range transcription, token counting)\n\n> Convention: This Skill follows the official Google Gen AI SDK (Node.js\u002FREST) as the main line; currently only Node.js\u002FREST examples are provided. If your project already wraps other languages or frameworks, map this Skill's request structure, model selection, and I\u002FO spec to your wrapper layer.\n\n---\n\n## 2. Quick routing (decide which capability to use)\n\n1) **Do you need to produce images?**\n- Need to generate images from scratch or edit based on an image -> use **Nano Banana image generation** (see Section 5)\n\n2) **Do you need to understand images?**\n- Need recognition, description, Q&A, comparison, or info extraction -> use **Image understanding** (see Section 6)\n\n3) **Do you need to produce video?**\n- Need to generate an 8-second video (optionally with native audio) -> use **Veo 3.1 video generation** (see Section 7)\n\n4) **Do you need to understand video?**\n- Need summaries\u002FQ&A\u002Fsegment extraction with timestamps -> use **Video understanding** (see Section 8)\n\n5) **Do you need to read text aloud?**\n- Need controllable narration, podcast\u002Faudiobook style, etc. -> use **Speech generation (TTS)** (see Section 9)\n\n6) **Do you need to understand audio?**\n- Need audio descriptions, transcription, time-range transcription, token counting -> use **Audio understanding** (see Section 10)\n\n---\n\n## 3. Unified engineering constraints and I\u002FO spec (must read)\n\n### 3.0 Prerequisites (dependencies and tools)\n\n- Node.js 18+ (match your project version)\n- Install SDK (example):\n```bash\nnpm install @google\u002Fgenai\n```\n- REST examples only need `curl`; if you need to parse image Base64, install `jq` (optional).\n\n### 3.1 Authentication and environment variables\n\n- Put your API key in `GEMINI_API_KEY`\n- REST requests use `x-goog-api-key: $GEMINI_API_KEY`\n\n### 3.2 Two file input modes: Inline vs Files API\n\n**Inline (embedded bytes\u002FBase64)**\n- Pros: shorter call chain, good for small files.\n- Key constraint: total request size (text prompt + system instructions + embedded bytes) typically has a ~20MB ceiling.\n\n**Files API (upload then reference)**\n- Pros: good for large files, reusing the same file, or multi-turn conversations.\n- Typical flow:\n  1. `files.upload(...)` (SDK) or `POST \u002Fupload\u002Fv1beta\u002Ffiles` (REST resumable)\n  2. Use `file_data` \u002F `file_uri` in `generateContent`\n\n> Engineering suggestion: implement `ensure_file_uri()` so that when a file exceeds a threshold (for example 10-15MB warning) or is reused, you automatically route through the Files API.\n\n### 3.3 Unified handling of binary media outputs\n\n- **Images**: usually returned as `inline_data` (Base64) in response parts; in the SDK use `part.as_image()` or decode Base64 and save as PNG\u002FJPG.\n- **Speech (TTS)**: usually returns **PCM** bytes (Base64); save as `.pcm` or wrap into `.wav` (commonly 24kHz, 16-bit, mono).\n- **Video (Veo)**: long-running async task; poll the operation; download the file (or use the returned URI).\n\n---\n\n## 4. Model selection matrix (choose by scenario)\n\n> Important: model names, versions, limits, and quotas can change over time. Verify against official docs before use. Last updated: 2026-01-22.\n\n### 4.1 Image generation (Nano Banana)\n- **gemini-2.5-flash-image**: optimized for speed\u002Fthroughput; good for frequent, low-latency generation\u002Fediting.\n- **gemini-3-pro-image-preview**: stronger instruction following and high-fidelity text rendering; better for professional assets and complex edits.\n\n### 4.2 General image\u002Fvideo\u002Faudio understanding\n- Docs use `gemini-3-flash-preview` for image, video, and audio understanding (choose stronger models as needed for quality\u002Fcost).\n\n### 4.3 Video generation (Veo)\n- Example model: `veo-3.1-generate-preview` (generates 8-second video and can natively generate audio).\n\n### 4.4 Speech generation (TTS)\n- Example model: `gemini-2.5-flash-preview-tts` (native TTS, currently in preview).\n\n---\n\n## 5. Image generation (Nano Banana)\n\n### 5.1 Text-to-Image\n\n**SDK (Node.js) minimal template**\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\nimport * as fs from \"node:fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-2.5-flash-image\",\n  contents:\n    \"Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme\",\n});\n\nconst parts = response.candidates?.[0]?.content?.parts ?? [];\nfor (const part of parts) {\n  if (part.text) console.log(part.text);\n  if (part.inlineData?.data) {\n    fs.writeFileSync(\"out.png\", Buffer.from(part.inlineData.data, \"base64\"));\n  }\n}\n```\n\n**REST (with imageConfig) minimal template**\n```bash\ncurl -s -X POST   \"https:\u002F\u002Fgenerativelanguage.googleapis.com\u002Fv1beta\u002Fmodels\u002Fgemini-2.5-flash-image:generateContent\"   -H \"x-goog-api-key: $GEMINI_API_KEY\"   -H \"Content-Type: application\u002Fjson\"   -d '{\n    \"contents\":[{\"parts\":[{\"text\":\"Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme\"}]}],\n    \"generationConfig\": {\"imageConfig\": {\"aspectRatio\":\"16:9\"}}\n  }'\n```\n\n**REST image parsing (Base64 decode)**\n```bash\ncurl -s -X POST \"https:\u002F\u002Fgenerativelanguage.googleapis.com\u002Fv1beta\u002Fmodels\u002Fgemini-2.5-flash-image:generateContent\" \\\n  -H \"x-goog-api-key: $GEMINI_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"contents\":[{\"parts\":[{\"text\":\"A minimal studio product shot of a nano banana\"}]}]}' \\\n  | jq -r '.candidates[0].content.parts[] | select(.inline_data) | .inline_data.data' \\\n  | base64 --decode > out.png\n\n# macOS can use: base64 -D > out.png\n```\n\n### 5.2 Text-and-Image-to-Image\n\nUse case: given an image, **add\u002Fremove\u002Fmodify elements**, change style, color grading, etc.\n\n**SDK (Node.js) minimal template**\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\nimport * as fs from \"node:fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst prompt =\n  \"Add a nano banana on the table, keep lighting consistent, cinematic tone.\";\nconst imageBase64 = fs.readFileSync(\"input.png\").toString(\"base64\");\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-2.5-flash-image\",\n  contents: [\n    { text: prompt },\n    { inlineData: { mimeType: \"image\u002Fpng\", data: imageBase64 } },\n  ],\n});\n\nconst parts = response.candidates?.[0]?.content?.parts ?? [];\nfor (const part of parts) {\n  if (part.inlineData?.data) {\n    fs.writeFileSync(\"edited.png\", Buffer.from(part.inlineData.data, \"base64\"));\n  }\n}\n```\n\n### 5.3 Multi-turn image iteration (Multi-turn editing)\n\nBest practice: use chat for continuous iteration (for example: generate first, then \"only edit a specific region\u002Felement\", then \"make variants in the same style\").  \nTo output mixed \"text + image\" results, set `response_modalities` to `[\"TEXT\", \"IMAGE\"]`.\n\n### 5.4 ImageConfig\n\nYou can set in `generationConfig.imageConfig` or the SDK config:\n- `aspectRatio`: e.g. `16:9`, `1:1`.\n- `imageSize`: e.g. `2K`, `4K` (higher resolution is usually slower\u002Fmore expensive and model support can vary).\n\n---\n\n## 6. Image understanding (Image Understanding)\n\n### 6.1 Two ways to provide input images\n\n- **Inline image data**: suitable for small files (total request size \u003C 20MB).\n- **Files API upload**: better for large files or reuse across multiple requests.\n\n### 6.2 Inline images (Node.js) minimal template\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\nimport * as fs from \"node:fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst imageBase64 = fs.readFileSync(\"image.jpg\").toString(\"base64\");\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-3-flash-preview\",\n  contents: [\n    { inlineData: { mimeType: \"image\u002Fjpeg\", data: imageBase64 } },\n    { text: \"Caption this image, and list any visible brands.\" },\n  ],\n});\n\nconsole.log(response.text);\n```\n\n### 6.3 Upload and reference with Files API (Node.js) minimal template\n```js\nimport { GoogleGenAI, createPartFromUri, createUserContent } from \"@google\u002Fgenai\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\nconst uploaded = await ai.files.upload({ file: \"image.jpg\" });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-3-flash-preview\",\n  contents: createUserContent([\n    createPartFromUri(uploaded.uri, uploaded.mimeType),\n    \"Caption this image.\",\n  ]),\n});\n\nconsole.log(response.text);\n```\n\n### 6.4 Multi-image prompts\n\nAppend multiple images as multiple `Part` entries in the same `contents`; you can mix uploaded references and inline bytes.\n\n---\n\n## 7. Video generation (Veo 3.1)\n\n### 7.1 Core features (must know)\n- Generates **8-second** high-fidelity video, optionally 720p \u002F 1080p \u002F 4k, and supports native audio generation (dialogue, ambience, SFX).\n- Supports:\n  - Aspect ratio (16:9 \u002F 9:16)\n  - Video extension (extend a generated video; typically limited to 720p)\n  - First\u002Flast frame control (frame-specific)\n  - Up to 3 reference images (image-based direction)\n\n### 7.2 SDK (Node.js) minimal template: async polling + download\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst prompt =\n  \"A cinematic shot of a cat astronaut walking on the moon. Include subtle wind ambience.\";\nlet operation = await ai.models.generateVideos({\n  model: \"veo-3.1-generate-preview\",\n  prompt,\n  config: { resolution: \"1080p\" },\n});\n\nwhile (!operation.done) {\n  await new Promise((resolve) => setTimeout(resolve, 10_000));\n  operation = await ai.operations.getVideosOperation({ operation });\n}\n\nconst video = operation.response?.generatedVideos?.[0]?.video;\nif (!video) throw new Error(\"No video returned\");\nawait ai.files.download({ file: video, downloadPath: \"out.mp4\" });\n```\n\n### 7.3 REST minimal template: predictLongRunning + poll + download\n\nKey point: Veo REST uses `:predictLongRunning` to return an operation name, then poll `GET \u002Fv1beta\u002F{operation_name}`; once done, download from the video URI in the response.\n\n### 7.4 Common controls (recommend a unified wrapper)\n\n- `aspectRatio`: `\"16:9\"` or `\"9:16\"`\n- `resolution`: `\"720p\" | \"1080p\" | \"4k\"` (higher resolutions are usually slower\u002Fmore expensive)\n- When writing prompts: put dialogue in quotes; explicitly call out SFX and ambience; use cinematography language (camera position, movement, composition, lens effects, mood).\n- Negative constraints: if the API supports a negative prompt field, use it; otherwise list elements you do not want to see.\n\n### 7.5 Important limits (engineering fallback needed)\n\n- Latency can vary from seconds to minutes; implement timeouts and retries.\n- Generated videos are only retained on the server for a limited time (download promptly).\n- Outputs include a SynthID watermark.\n\n**Polling fallback (with timeout\u002Fbackoff) pseudocode**\n```js\nconst deadline = Date.now() + 300_000; \u002F\u002F 5 min\nlet sleepMs = 2000;\nwhile (!operation.done && Date.now() \u003C deadline) {\n  await new Promise((resolve) => setTimeout(resolve, sleepMs));\n  sleepMs = Math.min(Math.floor(sleepMs * 1.5), 15_000);\n  operation = await ai.operations.getVideosOperation({ operation });\n}\nif (!operation.done) throw new Error(\"video generation timed out\");\n```\n\n---\n\n## 8. Video understanding (Video Understanding)\n\n### 8.1 Video input options\n- **Files API upload**: recommended when file > 100MB, video length > ~1 minute, or you need reuse.\n- **Inline video data**: for smaller files.\n- **Direct YouTube URL**: can analyze public videos.\n\n### 8.2 Files API (Node.js) minimal template\n```js\nimport { GoogleGenAI, createPartFromUri, createUserContent } from \"@google\u002Fgenai\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\nconst uploaded = await ai.files.upload({ file: \"sample.mp4\" });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-3-flash-preview\",\n  contents: createUserContent([\n    createPartFromUri(uploaded.uri, uploaded.mimeType),\n    \"Summarize this video. Provide timestamps for key events.\",\n  ]),\n});\n\nconsole.log(response.text);\n```\n\n### 8.3 Timestamp prompting strategy\n- Ask for segmented bullets with \"(mm:ss)\" timestamps.\n- Require \"evidence with specific time ranges\" and include downstream structured extraction (JSON) in the same prompt if needed.\n\n---\n\n## 9. Speech generation (Text-to-Speech, TTS)\n\n### 9.1 Positioning\n- Native TTS: for \"precise reading + controllable style\" (podcasts, audiobooks, ad voiceover, etc.).\n- Distinguish from the Live API: Live API is more interactive and non-structured audio\u002Fmultimodal conversation; TTS is focused on controlled narration.\n\n### 9.2 Single-speaker TTS (Node.js) minimal template\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\nimport * as fs from \"node:fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-2.5-flash-preview-tts\",\n  contents: [{ parts: [{ text: \"Say cheerfully: Have a wonderful day!\" }] }],\n  config: {\n    responseModalities: [\"AUDIO\"],\n    speechConfig: {\n      voiceConfig: {\n        prebuiltVoiceConfig: { voiceName: \"Kore\" },\n      },\n    },\n  },\n});\n\nconst data =\n  response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data ?? \"\";\nif (!data) throw new Error(\"No audio returned\");\nfs.writeFileSync(\"out.pcm\", Buffer.from(data, \"base64\"));\n```\n\n### 9.3 Multi-speaker TTS (max 2 speakers)\nRequirements:\n- Use `multiSpeakerVoiceConfig`\n- Each speaker name must match the dialogue labels in the prompt (e.g., Joe\u002FJane).\n\n### 9.4 Voice options and language\n- `voice_name` supports 30 prebuilt voices (for example Zephyr, Puck, Charon, Kore, etc.).\n- The model can auto-detect input language and supports 24 languages (see docs for the list).\n\n### 9.5 \"Director notes\" (strongly recommended for high-quality voice)\nProvide controllable directions for style, pace, accent, etc., but avoid over-constraining.\n\n---\n\n## 10. Audio understanding (Audio Understanding)\n\n### 10.1 Typical tasks\n- Describe audio content (including non-speech like birds, alarms, etc.)\n- Generate transcripts\n- Transcribe specific time ranges\n- Count tokens (for cost estimates\u002Fsegmentation)\n\n### 10.2 Files API (Node.js) minimal template\n```js\nimport { GoogleGenAI, createPartFromUri, createUserContent } from \"@google\u002Fgenai\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\nconst uploaded = await ai.files.upload({ file: \"sample.mp3\" });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-3-flash-preview\",\n  contents: createUserContent([\n    \"Describe this audio clip.\",\n    createPartFromUri(uploaded.uri, uploaded.mimeType),\n  ]),\n});\n\nconsole.log(response.text);\n```\n\n### 10.3 Key limits and engineering tips\n- Supports common formats: WAV\u002FMP3\u002FAIFF\u002FAAC\u002FOGG\u002FFLAC.\n- Audio tokenization: about 32 tokens\u002Fsecond (about 1920 tokens per minute; values may change).\n- Total audio length per prompt is capped at 9.5 hours; multi-channel audio is downmixed; audio is resampled (see docs for exact parameters).\n- If total request size exceeds 20MB, you must use the Files API.\n\n---\n\n## 11. End-to-end examples (composition)\n\n### Example A: Image generation -> validation via understanding\n1) Generate product images with Nano Banana (require negative space, consistent lighting).\n2) Use image understanding for self-check: verify text clarity, brand spelling, and unsafe elements.\n3) If not satisfied, feed the generated image into text+image editing and iterate.\n\n### Example B: Video generation -> video understanding -> narration script\n1) Generate an 8-second shot with Veo (include dialogue or SFX).\n2) Download and save (respect retention window).\n3) Upload video to video understanding to produce a storyboard + timestamps + narration copy (then feed to TTS).\n\n### Example C: Audio understanding -> time-range transcription -> TTS redub\n1) Upload meeting audio and transcribe full content.\n2) Transcribe or summarize specific time ranges.\n3) Use TTS to generate a \"broadcast\" version of the summary.\n\n---\n\n## 12. Compliance and risk (must follow)\n\n- Ensure you have the necessary rights to upload images\u002Fvideo\u002Faudio; do not generate infringing, deceptive, harassing, or harmful content.\n- Generated images and videos include SynthID watermarking; videos may also have regional\u002Fperson-based generation constraints.\n- Production systems must implement timeouts, retries, failure fallbacks, and human review\u002Fpost-processing for generated content.\n\n---\n\n## 13. Quick reference (Checklist)\n\n- [ ] Pick the right model: image generation (Flash Image \u002F Pro Image Preview), video generation (Veo 3.1), TTS (Gemini 2.5 TTS), understanding (Gemini Flash\u002FPro).\n- [ ] Pick the right input mode: inline for small files; Files API for large\u002Freuse.\n- [ ] Parse binary outputs correctly: image\u002Faudio via inline_data decode; video via operation polling + download.\n- [ ] For video generation: set aspectRatio \u002F resolution, and download promptly (avoid expiration).\n- [ ] For TTS: set response_modalities=[\"AUDIO\"]; max 2 speakers; speaker names must match prompt.\n- [ ] For audio understanding: countTokens when needed; segment long audio or use Files API.\n","# Gemini Multimodal Media (Image\u002FVideo\u002FSpeech) Skill\n\n## 1. Goals and scope\n\nThis Skill consolidates six Gemini API capabilities into reusable workflows and implementation templates:\n\n- Image generation (Nano Banana: text-to-image, image editing, multi-turn iteration)\n- Image understanding (caption\u002FVQA\u002Fclassification\u002Fcomparison, multi-image prompts; supports inline and Files API)\n- Video generation (Veo 3.1: text-to-video, aspect ratio\u002Fresolution control, reference-image guidance, first\u002Flast frames, video extension, native audio)\n- Video understanding (upload\u002Finline\u002FYouTube URL; summaries, Q&A, timestamped evidence)\n- Speech generation (Gemini native TTS: single-speaker and multi-speaker; controllable style\u002Faccent\u002Fpace\u002Ftone)\n- Audio understanding (upload\u002Finline; description, transcription, time-range transcription, token counting)\n\n> Convention: This Skill follows the official Google Gen AI SDK (Node.js\u002FREST) as the main line; currently only Node.js\u002FREST examples are provided. If your project already wraps other languages or frameworks, map this Skill's request structure, model selection, and I\u002FO spec to your wrapper layer.\n\n---\n\n## 2. Quick routing (decide which capability to use)\n\n1) **Do you need to produce images?**\n- Need to generate images from scratch or edit based on an image -> use **Nano Banana image generation** (see Section 5)\n\n2) **Do you need to understand images?**\n- Need recognition, description, Q&A, comparison, or info extraction -> use **Image understanding** (see Section 6)\n\n3) **Do you need to produce video?**\n- Need to generate an 8-second video (optionally with native audio) -> use **Veo 3.1 video generation** (see Section 7)\n\n4) **Do you need to understand video?**\n- Need summaries\u002FQ&A\u002Fsegment extraction with timestamps -> use **Video understanding** (see Section 8)\n\n5) **Do you need to read text aloud?**\n- Need controllable narration, podcast\u002Faudiobook style, etc. -> use **Speech generation (TTS)** (see Section 9)\n\n6) **Do you need to understand audio?**\n- Need audio descriptions, transcription, time-range transcription, token counting -> use **Audio understanding** (see Section 10)\n\n---\n\n## 3. Unified engineering constraints and I\u002FO spec (must read)\n\n### 3.0 Prerequisites (dependencies and tools)\n\n- Node.js 18+ (match your project version)\n- Install SDK (example):\n```bash\nnpm install @google\u002Fgenai\n```\n- REST examples only need `curl`; if you need to parse image Base64, install `jq` (optional).\n\n### 3.1 Authentication and environment variables\n\n- Put your API key in `GEMINI_API_KEY`\n- REST requests use `x-goog-api-key: $GEMINI_API_KEY`\n\n### 3.2 Two file input modes: Inline vs Files API\n\n**Inline (embedded bytes\u002FBase64)**\n- Pros: shorter call chain, good for small files.\n- Key constraint: total request size (text prompt + system instructions + embedded bytes) typically has a ~20MB ceiling.\n\n**Files API (upload then reference)**\n- Pros: good for large files, reusing the same file, or multi-turn conversations.\n- Typical flow:\n  1. `files.upload(...)` (SDK) or `POST \u002Fupload\u002Fv1beta\u002Ffiles` (REST resumable)\n  2. Use `file_data` \u002F `file_uri` in `generateContent`\n\n> Engineering suggestion: implement `ensure_file_uri()` so that when a file exceeds a threshold (for example 10-15MB warning) or is reused, you automatically route through the Files API.\n\n### 3.3 Unified handling of binary media outputs\n\n- **Images**: usually returned as `inline_data` (Base64) in response parts; in the SDK use `part.as_image()` or decode Base64 and save as PNG\u002FJPG.\n- **Speech (TTS)**: usually returns **PCM** bytes (Base64); save as `.pcm` or wrap into `.wav` (commonly 24kHz, 16-bit, mono).\n- **Video (Veo)**: long-running async task; poll the operation; download the file (or use the returned URI).\n\n---\n\n## 4. Model selection matrix (choose by scenario)\n\n> Important: model names, versions, limits, and quotas can change over time. Verify against official docs before use. Last updated: 2026-01-22.\n\n### 4.1 Image generation (Nano Banana)\n- **gemini-2.5-flash-image**: optimized for speed\u002Fthroughput; good for frequent, low-latency generation\u002Fediting.\n- **gemini-3-pro-image-preview**: stronger instruction following and high-fidelity text rendering; better for professional assets and complex edits.\n\n### 4.2 General image\u002Fvideo\u002Faudio understanding\n- Docs use `gemini-3-flash-preview` for image, video, and audio understanding (choose stronger models as needed for quality\u002Fcost).\n\n### 4.3 Video generation (Veo)\n- Example model: `veo-3.1-generate-preview` (generates 8-second video and can natively generate audio).\n\n### 4.4 Speech generation (TTS)\n- Example model: `gemini-2.5-flash-preview-tts` (native TTS, currently in preview).\n\n---\n\n## 5. Image generation (Nano Banana)\n\n### 5.1 Text-to-Image\n\n**SDK (Node.js) minimal template**\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\nimport * as fs from \"node:fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-2.5-flash-image\",\n  contents:\n    \"Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme\",\n});\n\nconst parts = response.candidates?.[0]?.content?.parts ?? [];\nfor (const part of parts) {\n  if (part.text) console.log(part.text);\n  if (part.inlineData?.data) {\n    fs.writeFileSync(\"out.png\", Buffer.from(part.inlineData.data, \"base64\"));\n  }\n}\n```\n\n**REST (with imageConfig) minimal template**\n```bash\ncurl -s -X POST   \"https:\u002F\u002Fgenerativelanguage.googleapis.com\u002Fv1beta\u002Fmodels\u002Fgemini-2.5-flash-image:generateContent\"   -H \"x-goog-api-key: $GEMINI_API_KEY\"   -H \"Content-Type: application\u002Fjson\"   -d '{\n    \"contents\":[{\"parts\":[{\"text\":\"Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme\"}]}],\n    \"generationConfig\": {\"imageConfig\": {\"aspectRatio\":\"16:9\"}}\n  }'\n```\n\n**REST image parsing (Base64 decode)**\n```bash\ncurl -s -X POST \"https:\u002F\u002Fgenerativelanguage.googleapis.com\u002Fv1beta\u002Fmodels\u002Fgemini-2.5-flash-image:generateContent\" \\\n  -H \"x-goog-api-key: $GEMINI_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"contents\":[{\"parts\":[{\"text\":\"A minimal studio product shot of a nano banana\"}]}]}' \\\n  | jq -r '.candidates[0].content.parts[] | select(.inline_data) | .inline_data.data' \\\n  | base64 --decode > out.png\n\n# macOS can use: base64 -D > out.png\n```\n\n### 5.2 Text-and-Image-to-Image\n\nUse case: given an image, **add\u002Fremove\u002Fmodify elements**, change style, color grading, etc.\n\n**SDK (Node.js) minimal template**\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\nimport * as fs from \"node:fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst prompt =\n  \"Add a nano banana on the table, keep lighting consistent, cinematic tone.\";\nconst imageBase64 = fs.readFileSync(\"input.png\").toString(\"base64\");\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-2.5-flash-image\",\n  contents: [\n    { text: prompt },\n    { inlineData: { mimeType: \"image\u002Fpng\", data: imageBase64 } },\n  ],\n});\n\nconst parts = response.candidates?.[0]?.content?.parts ?? [];\nfor (const part of parts) {\n  if (part.inlineData?.data) {\n    fs.writeFileSync(\"edited.png\", Buffer.from(part.inlineData.data, \"base64\"));\n  }\n}\n```\n\n### 5.3 Multi-turn image iteration (Multi-turn editing)\n\nBest practice: use chat for continuous iteration (for example: generate first, then \"only edit a specific region\u002Felement\", then \"make variants in the same style\").  \nTo output mixed \"text + image\" results, set `response_modalities` to `[\"TEXT\", \"IMAGE\"]`.\n\n### 5.4 ImageConfig\n\nYou can set in `generationConfig.imageConfig` or the SDK config:\n- `aspectRatio`: e.g. `16:9`, `1:1`.\n- `imageSize`: e.g. `2K`, `4K` (higher resolution is usually slower\u002Fmore expensive and model support can vary).\n\n---\n\n## 6. Image understanding (Image Understanding)\n\n### 6.1 Two ways to provide input images\n\n- **Inline image data**: suitable for small files (total request size \u003C 20MB).\n- **Files API upload**: better for large files or reuse across multiple requests.\n\n### 6.2 Inline images (Node.js) minimal template\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\nimport * as fs from \"node:fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst imageBase64 = fs.readFileSync(\"image.jpg\").toString(\"base64\");\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-3-flash-preview\",\n  contents: [\n    { inlineData: { mimeType: \"image\u002Fjpeg\", data: imageBase64 } },\n    { text: \"Caption this image, and list any visible brands.\" },\n  ],\n});\n\nconsole.log(response.text);\n```\n\n### 6.3 Upload and reference with Files API (Node.js) minimal template\n```js\nimport { GoogleGenAI, createPartFromUri, createUserContent } from \"@google\u002Fgenai\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\nconst uploaded = await ai.files.upload({ file: \"image.jpg\" });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-3-flash-preview\",\n  contents: createUserContent([\n    createPartFromUri(uploaded.uri, uploaded.mimeType),\n    \"Caption this image.\",\n  ]),\n});\n\nconsole.log(response.text);\n```\n\n### 6.4 Multi-image prompts\n\nAppend multiple images as multiple `Part` entries in the same `contents`; you can mix uploaded references and inline bytes.\n\n---\n\n## 7. Video generation (Veo 3.1)\n\n### 7.1 Core features (must know)\n- Generates **8-second** high-fidelity video, optionally 720p \u002F 1080p \u002F 4k, and supports native audio generation (dialogue, ambience, SFX).\n- Supports:\n  - Aspect ratio (16:9 \u002F 9:16)\n  - Video extension (extend a generated video; typically limited to 720p)\n  - First\u002Flast frame control (frame-specific)\n  - Up to 3 reference images (image-based direction)\n\n### 7.2 SDK (Node.js) minimal template: async polling + download\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst prompt =\n  \"A cinematic shot of a cat astronaut walking on the moon. Include subtle wind ambience.\";\nlet operation = await ai.models.generateVideos({\n  model: \"veo-3.1-generate-preview\",\n  prompt,\n  config: { resolution: \"1080p\" },\n});\n\nwhile (!operation.done) {\n  await new Promise((resolve) => setTimeout(resolve, 10_000));\n  operation = await ai.operations.getVideosOperation({ operation });\n}\n\nconst video = operation.response?.generatedVideos?.[0]?.video;\nif (!video) throw new Error(\"No video returned\");\nawait ai.files.download({ file: video, downloadPath: \"out.mp4\" });\n```\n\n### 7.3 REST minimal template: predictLongRunning + poll + download\n\nKey point: Veo REST uses `:predictLongRunning` to return an operation name, then poll `GET \u002Fv1beta\u002F{operation_name}`; once done, download from the video URI in the response.\n\n### 7.4 Common controls (recommend a unified wrapper)\n\n- `aspectRatio`: `\"16:9\"` or `\"9:16\"`\n- `resolution`: `\"720p\" | \"1080p\" | \"4k\"` (higher resolutions are usually slower\u002Fmore expensive)\n- When writing prompts: put dialogue in quotes; explicitly call out SFX and ambience; use cinematography language (camera position, movement, composition, lens effects, mood).\n- Negative constraints: if the API supports a negative prompt field, use it; otherwise list elements you do not want to see.\n\n### 7.5 Important limits (engineering fallback needed)\n\n- Latency can vary from seconds to minutes; implement timeouts and retries.\n- Generated videos are only retained on the server for a limited time (download promptly).\n- Outputs include a SynthID watermark.\n\n**Polling fallback (with timeout\u002Fbackoff) pseudocode**\n```js\nconst deadline = Date.now() + 300_000; \u002F\u002F 5 min\nlet sleepMs = 2000;\nwhile (!operation.done && Date.now() \u003C deadline) {\n  await new Promise((resolve) => setTimeout(resolve, sleepMs));\n  sleepMs = Math.min(Math.floor(sleepMs * 1.5), 15_000);\n  operation = await ai.operations.getVideosOperation({ operation });\n}\nif (!operation.done) throw new Error(\"video generation timed out\");\n```\n\n---\n\n## 8. Video understanding (Video Understanding)\n\n### 8.1 Video input options\n- **Files API upload**: recommended when file > 100MB, video length > ~1 minute, or you need reuse.\n- **Inline video data**: for smaller files.\n- **Direct YouTube URL**: can analyze public videos.\n\n### 8.2 Files API (Node.js) minimal template\n```js\nimport { GoogleGenAI, createPartFromUri, createUserContent } from \"@google\u002Fgenai\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\nconst uploaded = await ai.files.upload({ file: \"sample.mp4\" });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-3-flash-preview\",\n  contents: createUserContent([\n    createPartFromUri(uploaded.uri, uploaded.mimeType),\n    \"Summarize this video. Provide timestamps for key events.\",\n  ]),\n});\n\nconsole.log(response.text);\n```\n\n### 8.3 Timestamp prompting strategy\n- Ask for segmented bullets with \"(mm:ss)\" timestamps.\n- Require \"evidence with specific time ranges\" and include downstream structured extraction (JSON) in the same prompt if needed.\n\n---\n\n## 9. Speech generation (Text-to-Speech, TTS)\n\n### 9.1 Positioning\n- Native TTS: for \"precise reading + controllable style\" (podcasts, audiobooks, ad voiceover, etc.).\n- Distinguish from the Live API: Live API is more interactive and non-structured audio\u002Fmultimodal conversation; TTS is focused on controlled narration.\n\n### 9.2 Single-speaker TTS (Node.js) minimal template\n```js\nimport { GoogleGenAI } from \"@google\u002Fgenai\";\nimport * as fs from \"node:fs\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-2.5-flash-preview-tts\",\n  contents: [{ parts: [{ text: \"Say cheerfully: Have a wonderful day!\" }] }],\n  config: {\n    responseModalities: [\"AUDIO\"],\n    speechConfig: {\n      voiceConfig: {\n        prebuiltVoiceConfig: { voiceName: \"Kore\" },\n      },\n    },\n  },\n});\n\nconst data =\n  response.candidates?.[0]?.content?.parts?.[0]?.inlineData?.data ?? \"\";\nif (!data) throw new Error(\"No audio returned\");\nfs.writeFileSync(\"out.pcm\", Buffer.from(data, \"base64\"));\n```\n\n### 9.3 Multi-speaker TTS (max 2 speakers)\nRequirements:\n- Use `multiSpeakerVoiceConfig`\n- Each speaker name must match the dialogue labels in the prompt (e.g., Joe\u002FJane).\n\n### 9.4 Voice options and language\n- `voice_name` supports 30 prebuilt voices (for example Zephyr, Puck, Charon, Kore, etc.).\n- The model can auto-detect input language and supports 24 languages (see docs for the list).\n\n### 9.5 \"Director notes\" (strongly recommended for high-quality voice)\nProvide controllable directions for style, pace, accent, etc., but avoid over-constraining.\n\n---\n\n## 10. Audio understanding (Audio Understanding)\n\n### 10.1 Typical tasks\n- Describe audio content (including non-speech like birds, alarms, etc.)\n- Generate transcripts\n- Transcribe specific time ranges\n- Count tokens (for cost estimates\u002Fsegmentation)\n\n### 10.2 Files API (Node.js) minimal template\n```js\nimport { GoogleGenAI, createPartFromUri, createUserContent } from \"@google\u002Fgenai\";\n\nconst ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });\nconst uploaded = await ai.files.upload({ file: \"sample.mp3\" });\n\nconst response = await ai.models.generateContent({\n  model: \"gemini-3-flash-preview\",\n  contents: createUserContent([\n    \"Describe this audio clip.\",\n    createPartFromUri(uploaded.uri, uploaded.mimeType),\n  ]),\n});\n\nconsole.log(response.text);\n```\n\n### 10.3 Key limits and engineering tips\n- Supports common formats: WAV\u002FMP3\u002FAIFF\u002FAAC\u002FOGG\u002FFLAC.\n- Audio tokenization: about 32 tokens\u002Fsecond (about 1920 tokens per minute; values may change).\n- Total audio length per prompt is capped at 9.5 hours; multi-channel audio is downmixed; audio is resampled (see docs for exact parameters).\n- If total request size exceeds 20MB, you must use the Files API.\n\n---\n\n## 11. End-to-end examples (composition)\n\n### Example A: Image generation -> validation via understanding\n1) Generate product images with Nano Banana (require negative space, consistent lighting).\n2) Use image understanding for self-check: verify text clarity, brand spelling, and unsafe elements.\n3) If not satisfied, feed the generated image into text+image editing and iterate.\n\n### Example B: Video generation -> video understanding -> narration script\n1) Generate an 8-second shot with Veo (include dialogue or SFX).\n2) Download and save (respect retention window).\n3) Upload video to video understanding to produce a storyboard + timestamps + narration copy (then feed to TTS).\n\n### Example C: Audio understanding -> time-range transcription -> TTS redub\n1) Upload meeting audio and transcribe full content.\n2) Transcribe or summarize specific time ranges.\n3) Use TTS to generate a \"broadcast\" version of the summary.\n\n---\n\n## 12. Compliance and risk (must follow)\n\n- Ensure you have the necessary rights to upload images\u002Fvideo\u002Faudio; do not generate infringing, deceptive, harassing, or harmful content.\n- Generated images and videos include SynthID watermarking; videos may also have regional\u002Fperson-based generation constraints.\n- Production systems must implement timeouts, retries, failure fallbacks, and human review\u002Fpost-processing for generated content.\n\n---\n\n## 13. Quick reference (Checklist)\n\n- [ ] Pick the right model: image generation (Flash Image \u002F Pro Image Preview), video generation (Veo 3.1), TTS (Gemini 2.5 TTS), understanding (Gemini Flash\u002FPro).\n- [ ] Pick the right input mode: inline for small files; Files API for large\u002Freuse.\n- [ ] Parse binary outputs correctly: image\u002Faudio via inline_data decode; video via operation polling + download.\n- [ ] For video generation: set aspectRatio \u002F resolution, and download promptly (avoid expiration).\n- [ ] For TTS: set response_modalities=[\"AUDIO\"]; max 2 speakers; speaker names must match prompt.\n- [ ] For audio understanding: countTokens when needed; segment long audio or use Files API.\n",{"name":5,"license":15,"description":7},"main","b80cde2ef85241dd4fd54a1b934f5e22835f78ba","skills\u002Fgoogle-gemini-media",102,"https:\u002F\u002Fgithub.com\u002Fsundial-org\u002Fawesome-openclaw-skills","https:\u002F\u002Fgithub.com\u002Fsundial-org","https:\u002F\u002Fwww.sundialhub.com","2026-03-07 14:57:19",{"source":8,"skillName":5,"commands":60,"prompt":70,"zipAvailable":71},[61,64,67],{"tool":62,"command":63},"npx","npx skills add sundial-org\u002Fawesome-openclaw-skills --skill google-gemini-media",{"tool":65,"command":66},"bunx","bunx skills add sundial-org\u002Fawesome-openclaw-skills --skill google-gemini-media",{"tool":68,"command":69},"pnpm","pnpm dlx skills add sundial-org\u002Fawesome-openclaw-skills --skill google-gemini-media","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsundial-org\u002Fawesome-openclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fgoogle-gemini-media\u002FSKILL.md",true,[73,79,84,88,92,96],{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"CHANGELOG.md","REFERENCE","参考文档",820,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fkucoin-official-futures-trading\u002FCHANGELOG.md",{"path":80,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"LICENSE","许可证",1072,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fkucoin-official-futures-trading\u002FLICENSE",{"path":85,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":86,"sourceHtmlUrl":87},"LICENSE.md",1065,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fkucoin-official-futures-trading\u002FLICENSE.md",{"path":89,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":90,"sourceHtmlUrl":91},"references\u002Fauthentication.md",8294,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fkucoin-official-futures-trading\u002Freferences\u002Fauthentication.md",{"path":93,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":94,"sourceHtmlUrl":95},"SOURCE.md",169,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fkucoin-official-futures-trading\u002FSOURCE.md",{"path":97,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":98,"sourceHtmlUrl":99},"TRUST.auto.yaml",2232,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fkucoin-official-futures-trading\u002FTRUST.auto.yaml",[101,111,139,161,185,208],{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":46},"01M6CGQVNAEMJTA5P9GZVYNCVG","x-trends","Fetches current top trending topics on X (Twitter) for any country using public aggregators.","https:\u002F\u002Fgithub.com\u002Fsundial-org\u002Fawesome-openclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fx-trends\u002FSKILL.md",[],[108,109,110],"x trends","public","twitter",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":120,"publishedAt":46},"01M6CGKR0DGWD64YAYJ4WH32C0","vercel-react-best-practices","React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React\u002FNext.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.","https:\u002F\u002Fgithub.com\u002Fsundial-org\u002Fawesome-openclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fvercel-react-best-practices\u002FSKILL.md",[117],{"categoryNo":118,"categoryName":119,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[121,122,123,124,125,126,127,128,129,130,131,132,133,35,134,135,136,137,138],"vercel react best practices","react","best practices","react best practices","vercel","tasks","performance optimization","js","refactoring","Next.js","data","Optimization","engineering","guidelines","react components","components","performance","writing",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":145,"publishedAt":46},"01M6CGGNS5N14QNV719AK25G94","topydo","Manage todo.txt tasks using topydo CLI. Add, list, complete, prioritize, tag, and organize tasks with dependencies, due dates, recurrence, and projects. Use for any task management, todo lists, or when the user mentions tasks, todos, or todo.txt. Requires Python 3 and pip. Works on macOS, Linux, and Windows.","https:\u002F\u002Fgithub.com\u002Fsundial-org\u002Fawesome-openclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftopydo\u002FSKILL.md",[],[141,146,126,147,148,149,150,151,152,153,154,155,156,157,158,159,44,160],"windows","prioritize","linux","projects","task management","list","github","python","cli","macos","management","todo","task","manage","user",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":46},"01M6CFRM7YJ2Q07KTV6CH0PMCK","openclaw-feeds","RSS news aggregator. Fetches headlines from curated feeds across three categories: news, games, and finance. Use when the user asks about current news, headlines, what's happening, what's going on, or says \"what's up in news\", \"what's up in finance\", \"what's up in games\", or the German equivalents \"was geht mit nachrichten\", \"was geht mit money\", \"was geht mit gaming\". Also activates for requests like \"give me a news rundown\", \"latest headlines\", \"market news\", \"gaming news\", \"tech news\", \"finance roundup\", or \"briefing\". Returns structured JSON from public RSS feeds — no API keys, no web search needed.","https:\u002F\u002Fgithub.com\u002Fsundial-org\u002Fawesome-openclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fopenclaw-feeds\u002FSKILL.md",[],[168,169,170,171,172,173,174,44,175,176,177,178,179,180,40,181,182,183,153,184],"openclaw","feeds","openclaw feeds","fetch","german","Market","up","install","json","rss","web search","access","Bash","roundup","search","web","python3",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":195,"publishedAt":46},"01M6CFQMN6XK3X0D0FFAJ4ZCC0","octolens","Query and analyze brand mentions from Octolens API. Use when the user wants to fetch mentions, track keywords, filter by source platforms (Twitter, Reddit, GitHub, LinkedIn, etc.), sentiment analysis, or analyze social media engagement. Supports complex filtering with AND\u002FOR logic, date ranges, follower counts, and bookmarks.","https:\u002F\u002Fgithub.com\u002Fsundial-org\u002Fawesome-openclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Foctolens\u002FSKILL.md",[191,194],{"categoryNo":192,"categoryName":193,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[187,31,40,196,197,198,152,179,44,199,200,171,201,202,203,204,110,205,206,207],"analysis","sentiment","sentiment analysis","engagement","filtering","read","bookmarks","social media","linkedin","node","brand","analyze",{"skillNo":209,"name":210,"nameZh":6,"description":211,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":212,"categories":213,"keywords":215,"publishedAt":46},"01M6CFEG2QX0E4Y9D5VFXWGQ2X","lmstudio-subagents","Reduces token usage from paid providers by offloading work to local LM Studio models. Use when: (1) Cutting costs—use local models for summarization, extraction, classification, rewriting, first-pass review, brainstorming when quality suffices, (2) Avoiding paid API calls for high-volume or repetitive tasks, (3) No extra model configuration—JIT loading and REST API work with existing LM Studio setup, (4) Local-only or privacy-sensitive work. Requires LM Studio 0.4+ with server (default :1234). No CLI required.","https:\u002F\u002Fgithub.com\u002Fsundial-org\u002Fawesome-openclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Flmstudio-subagents\u002FSKILL.md",[214],{"categoryNo":192,"categoryName":193,"taxonomyType":21,"taxonomyTypeDesc":22},[216,217,218,219,220,221,44,222,223,224,40,225,226,227,228,229,126,230,154,231],"lmstudio subagents","subagents","quality","default","models","only","work","model","classification","first","REST","Local Models","privacy","server","brainstorming","review"]