AI 解说大师 — CLI 客户端;用于终端调用视频解说生成 API
SaferSkills independently audited narrator-ai-cli (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You have access to narrator-ai-cli, a CLI tool for the Narrator AI video narration API. Always use --json flag for all commands to get structured output you can parse.
The CLI must be configured before use. Check with:
narrator-ai-cli config showIf not configured, set up with:
narrator-ai-cli config set app_key <app_key>Server defaults to https://openapi.jieshuo.cn — no need to configure.
Need an app_key or help with setup? Contact us to get started:
联系客服
narrator-ai-cli task query <task_id> --json until status is 2 (success) or 3 (failed).generate-writing's task_order_num (NOT clip-data's)fast-clip-data's task_order_numid as dubbing, pass type as dubbing_type. They are two separate fields.negative_oss_key to the same value as video_oss_key in episodes_data.Before starting any workflow, you need to help the user make the following choices. Present the options and let the user decide. Do NOT pick for them.
ASK: "请选择工作流路径:"
ASK: "解说风格:使用预置模板还是自定义学习?"
narrator-ai-cli task narration-styles --json
# or filter: narrator-ai-cli task narration-styles --genre <genre> --jsonShow the list to user, let them pick one. The id field is the learning_model_id.
Requires user to provide a reference video + SRT. The output learning_model_id is used in generate-writing.
ASK: "电影素材:使用预置素材还是自己上传的文件?"
narrator-ai-cli material list --json
# or search: narrator-ai-cli material list --search "<movie_name>" --json
# or filter: narrator-ai-cli material list --genre <genre> --jsonShow results to user. Each entry has video_id and srt_id.
video_id as video_oss_key AND negative_oss_keysrt_id as srt_oss_key narrator-ai-cli file list --json
# or search: narrator-ai-cli file list --search "<keyword>" --json
# or transfer by link: narrator-ai-cli file transfer --link "<url>" --jsonUser picks video and SRT files from their cloud storage.
ASK: "背景音乐:使用预置BGM还是自己上传的音频?"
narrator-ai-cli bgm list --json
# or search: narrator-ai-cli bgm list --search "<keyword>" --jsonShow results to user. The id field is the bgm parameter value.
narrator-ai-cli file list --jsonUser picks an audio file. Use its file_id as the bgm parameter.
ASK: "配音角色:请选择配音语言和角色"
# First show available languages
narrator-ai-cli dubbing languages --json
# Then list voices for chosen language
narrator-ai-cli dubbing list --lang <language> --json
# Or filter by genre recommendation
narrator-ai-cli dubbing list --tag <genre_tag> --jsonShow results to user. From the selected voice:
id field → pass as dubbing parametertype field → pass as dubbing_type parameterThere is no "custom upload" option for dubbing — always pick from the pre-built list. (Users can create custom voices via voice-clone task separately.)
ASK: "是否需要应用视觉模板?(可选步骤)"
narrator-ai-cli task templates --jsonShow results to user, let them pick. The name field goes into template_name list.
popular-learning(optional) -> generate-writing -> clip-data -> video-composing -> magic-video(optional)Based on Decision 2:
# Option A: Pre-built template (recommended)
narrator-ai-cli task narration-styles --json
# -> user picks one -> learning_model_id = selected item's "id"
# Option B: Custom learning
narrator-ai-cli task create popular-learning --json -d '{
"video_srt_path": "<srt_file_id from material or file list>",
"video_path": "<video_file_id from material or file list>"
}'
# Poll until done -> extract learning_model_id from results# 2a. Search movie info (for confirmed_movie_json / story_info)
narrator-ai-cli task search-movie "<movie_name>" --json
# Show 3 results to user, let them pick one
# 2b. Get source files (based on Decision 3)
# Option A: narrator-ai-cli material list --search "<movie_name>" --json
# Option B: narrator-ai-cli file list --json
# -> user picks video and SRT files
# 2c. Create task
narrator-ai-cli task create generate-writing --json -d '{
"learning_model_id": "<from step 1>",
"learning_srt": "",
"native_video": "",
"native_srt": "",
"playlet_name": "<movie_name>",
"playlet_num": "1",
"target_platform": "抖音",
"vendor_requirements": "",
"task_count": 1,
"target_character_name": "<ASK user for main character name>",
"story_info": "",
"episodes_data": [{"video_oss_key": "<video_id>", "srt_oss_key": "<srt_id>", "negative_oss_key": "<video_id>", "num": 1}]
}'
# Poll -> extract task_order_num and results.file_ids[0]# 3a. Get BGM (based on Decision 4)
# Option A: narrator-ai-cli bgm list --json -> user picks -> bgm = selected "id"
# Option B: narrator-ai-cli file list --json -> user picks audio -> bgm = selected "file_id"
# 3b. Get dubbing voice (Decision 5)
# narrator-ai-cli dubbing list --lang <lang> --json -> user picks
# -> dubbing = selected "id", dubbing_type = selected "type"
# 3c. Create task
narrator-ai-cli task create clip-data --json -d '{
"order_num": "<task_order_num from step 2>",
"bgm": "<from Decision 4>",
"dubbing": "<id from Decision 5>",
"dubbing_type": "<type from Decision 5>"
}'
# Poll -> extract results.file_ids[0]IMPORTANT: order_num is from step 2 (generate-writing), NOT step 3 (clip-data).
narrator-ai-cli task create video-composing --json -d '{
"order_num": "<task_order_num from step 2 (generate-writing)>",
"bgm": "<same bgm as step 3>",
"dubbing": "<same dubbing as step 3>",
"dubbing_type": "<same dubbing_type as step 3>"
}'
# Poll -> extract video URLs from resultsBased on Decision 6:
# List visual templates
narrator-ai-cli task templates --json
# -> user picks template name
# Apply template
narrator-ai-cli task create magic-video --json -d '{
"task_id": "<task_id from step 4>",
"template_name": ["<selected template name>"]
}'search-movie -> fast-writing -> fast-clip-data -> video-composing -> magic-video(optional)# Get narration style template (Decision 2)
narrator-ai-cli task narration-styles --json
# -> user picks one -> learning_model_id
# Search movie info (required for target_mode=1)
narrator-ai-cli task search-movie "<movie_name>" --json
# -> show 3 results, user picks one -> confirmed_movie_jsonASK user to choose a mode:
confirmed_movie_json from search-movie.episodes_data[{srt_oss_key, num}].episodes_data[{srt_oss_key, num}].# Mode 1 example (most common):
narrator-ai-cli task create fast-writing --json -d '{
"learning_model_id": "<from Decision 2>",
"target_mode": "1",
"playlet_name": "<movie_name>",
"model": "flash",
"language": "Chinese (中文)",
"perspective": "third_person",
"confirmed_movie_json": <user-selected search result>
}'
# Mode 2/3 example:
narrator-ai-cli task create fast-writing --json -d '{
"learning_model_id": "<from Decision 2>",
"target_mode": "2",
"playlet_name": "<movie_name>",
"episodes_data": [{"srt_oss_key": "<srt_file_id>", "num": 1}]
}'
# Poll -> extract task_id and results.file_ids[0]# 2a. Get BGM (Decision 4)
# Option A: narrator-ai-cli bgm list --json -> user picks
# Option B: narrator-ai-cli file list --json -> user picks audio
# 2b. Get dubbing voice (Decision 5)
# narrator-ai-cli dubbing list --lang <lang> --json -> user picks
# 2c. Get source files (Decision 3)
# Option A: narrator-ai-cli material list --search "<movie_name>" --json
# Option B: narrator-ai-cli file list --json
# 2d. Create task
narrator-ai-cli task create fast-clip-data --json -d '{
"task_id": "<task_id from step 1>",
"file_id": "<results.file_ids[0] from step 1>",
"bgm": "<from Decision 4>",
"dubbing": "<id from Decision 5>",
"dubbing_type": "<type from Decision 5>",
"episodes_data": [{"video_oss_key": "<video_id>", "srt_oss_key": "<srt_id>", "negative_oss_key": "<video_id>", "num": 1}]
}'
# Poll -> extract task_order_numIMPORTANT: In 原创文案 path, order_num comes from fast-clip-data's task_order_num.
narrator-ai-cli task create video-composing --json -d '{
"order_num": "<task_order_num from step 2 (fast-clip-data)>",
"bgm": "<same bgm as step 2>",
"dubbing": "<same dubbing as step 2>",
"dubbing_type": "<same dubbing_type as step 2>"
}'
# Poll -> extract video URLs from resultsBased on Decision 6:
narrator-ai-cli task templates --json
# -> user picks template
narrator-ai-cli task create magic-video --json -d '{
"task_id": "<task_id from step 3>",
"template_name": ["<selected template name>"]
}'# Voice Clone — clone a voice from audio sample
narrator-ai-cli task create voice-clone --json -d '{"audio_file_id": "<file_id from file list>"}'
# Text to Speech — convert text using cloned voice
narrator-ai-cli task create tts --json -d '{"voice_id": "<id>", "audio_text": "text"}'# Account
narrator-ai-cli user balance --json
# Tasks
narrator-ai-cli task list --json
narrator-ai-cli task list --status 2 --type 9 --json # filter: status 0-4, type 1-10
narrator-ai-cli task query <task_id> --json
narrator-ai-cli task budget --json -d '{...}' # estimate points
narrator-ai-cli task verify --json -d '{...}' # verify materials
# Writing management
narrator-ai-cli task get-writing --task-id <id> --file-id <id> --json
narrator-ai-cli task save-writing --json -d '{"task_id":"...", "file_id":"...", "content":[{"type":"解说","text":"..."}]}'
# Files (user's uploaded files)
narrator-ai-cli file list --json
narrator-ai-cli file list --search "<keyword>" --json
narrator-ai-cli file upload ./file.mp4 --json
narrator-ai-cli file transfer --link "<url>" --json # transfer by HTTP/Baidu/PikPak link
narrator-ai-cli file info <file_id> --json
narrator-ai-cli file download <file_id> --json
narrator-ai-cli file storage --json
narrator-ai-cli file delete <file_id> --json
# Pre-built Resources
narrator-ai-cli task narration-styles --json # 90+ narration style templates
narrator-ai-cli task narration-styles --genre <g> --json
narrator-ai-cli material list --json # 93 pre-built movies (video + SRT)
narrator-ai-cli material list --genre <g> --json
narrator-ai-cli material list --search "<name>" --json
narrator-ai-cli material genres --json
narrator-ai-cli bgm list --json # 146 pre-built BGM tracks
narrator-ai-cli bgm list --search "<name>" --json
narrator-ai-cli dubbing list --json # 63 pre-built dubbing voices
narrator-ai-cli dubbing list --lang <lang> --json
narrator-ai-cli dubbing list --tag <tag> --json
narrator-ai-cli dubbing languages --json
narrator-ai-cli dubbing tags --json
narrator-ai-cli task templates --json # visual templates (magic-video)
narrator-ai-cli task search-movie "<name>" --json # movie info search
# All pre-built resources can be previewed at:
# https://ceex7z9m67.feishu.cn/wiki/WLPnwBysairenFkZDbicZOfKnbc0 = init1 = in_progress2 = success (done, extract results)3 = failed (check error_message_slug)4 = cancelled10001 = failed (generic)10004 = invalid app key10009 = insufficient balance — notify the user: ⚠️ 账户余额不足,请联系客服充值或获取 App Key:
📧 Email: [email protected]Then display: 
10010 = task not found60000 = retryable error (retry the operation)~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.