
Byted Las Video Inpaint
- 38 installs
- 411 repo stars
- Updated August 4, 2026
- bytedance/agentkit-samples
byted-las-video-inpaint is a Claude skill that wraps Volcengine LAS to remove watermarks, subtitles and logos from video via AI inpainting on fixed regions.
About
This skill wraps the Volcengine LAS video-inpainting operator through the lasutil CLI to erase fixed-region artifacts from video. A developer uses it to remove watermarks, hardcoded subtitles, logos or text overlays, optionally targeting exact bounding boxes. It submits an async task and polls for the repaired video, which the service writes to a TOS output path the user provides.
- Wraps Volcengine LAS las_video_inpaint to remove watermarks, subtitles and logos from video
- Supports fixed-region removal via bounding boxes and videos up to 4 hours / 30GB
- Async submit-poll workflow that writes the repaired video to a user-provided TOS output path
Byted Las Video Inpaint by the numbers
- 38 all-time installs (skills.sh)
- Ranked #933 of 1,335 Generative Media skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
byted-las-video-inpaint capabilities & compatibility
Requires a Volcengine LAS_API_KEY; billed per video duration and mode by Volcengine, not free.
- Capabilities
- watermark removal · subtitle removal · video restoration
- Use cases
- video generation
- Pricing
- Bring your own API key
What byted-las-video-inpaint says it does
去除视频中的水印、字幕、Logo。支持指定固定区域修复(`fixed_bboxes`)。多种修复后端可选。
**使用限制**:视频时长 ≤ 4 小时,文件大小 ≤ 30GB。
**环境变量**: `LAS_API_KEY` (必填)
npx skills add https://github.com/bytedance/agentkit-samples --skill byted-las-video-inpaintAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 38 |
|---|---|
| repo stars | ★ 411 |
| Last updated | August 4, 2026 |
| Repository | bytedance/agentkit-samples ↗ |
What it does
Remove watermarks, hardcoded subtitles and logos from videos up to 4h/30GB using Volcengine LAS inpainting.
Who is it for?
Erasing watermarks, hardcoded subtitles, logos or text overlays from video footage on fixed regions.
Skip if: Moving-object removal or tasks with no writable TOS output directory, which is a required parameter.
When should I use this skill?
The user wants to remove a watermark, erase hardcoded subtitles, or delete a logo or text overlay from a video.
What you get
Returns a repaired video with the specified watermarks, subtitles or logos erased, stored at the user's TOS output path.
- inpainted_video_path (repaired video URL)
By the numbers
- videos up to 4 hours and 30GB
- 6-step submit-poll workflow (Step 0 to Step 5)
Files
LAS 视频修复(las_video_inpaint)
去除视频中的水印、字幕、Logo。支持指定固定区域修复(fixed_bboxes)。多种修复后端可选。
使用限制:视频时长 ≤ 4 小时,文件大小 ≤ 30GB。
设计模式
本 skill 主要采用:
- Tool Wrapper:封装
lasutilCLI 调用 - Pipeline:包含 Step 0 → Step N 的顺序工作流
核心 API 与配置
- 算子 ID:
las_video_inpaint - API: 异步(
submit→poll) - 环境变量:
LAS_API_KEY(必填)
详细参数与接口定义见 references/api.md。
Gotchas
- 密钥安全:若聊天框屏蔽密钥,让用户在当前目录创建
env.sh并写入export LAS_API_KEY="...",SDK 会自动读取。 - 免责声明:最终回复结果时必须包含:"本方式的计费均为预估计费,与实际费用有差距,实际费用以运行后火山产生的账单为准。计费说明请参考 Volcengine LAS 定价。",且禁止使用"实际费用"字眼描述预估价。
工作流(严格按步骤执行)
复制此清单并跟踪进度:
执行进度:
- [ ] Step 0: 前置检查
- [ ] Step 1: 初始化与准备
- [ ] Step 2: 预估价格
- [ ] Step 3: 提交任务
- [ ] Step 4: 异步查询
- [ ] Step 5: 结果呈现Step 0: 前置检查(⚠️ 必须在第一轮对话中完成)
在接受用户的任务后,不要立即开始执行,必须首先进行以下环境检查: 1. 检查 `LAS_API_KEY` 与 `LAS_REGION`:确认环境变量或 .env 中是否已配置。
- 若无,必须立即向用户索要(提示:
LAS_REGION常见为cn-beijing)。 - 注意:
LAS_REGION必须与您的 API Key 及 TOS Bucket 所在的地域完全一致。如果用户中途切换了 Region,必须提醒用户其 TOS Bucket 也需对应更换,否则会导致权限异常或上传失败。
2. 检查输入路径:
- 如果用户要求处理的是本地文件,则需要先通过 File API 上传至 TOS(只需
LAS_API_KEY,无需额外 TOS 凭证)。 - 如果算子的输出结果存放在 TOS 上,且用户需要下载回本地,则需要
VOLCENGINE_ACCESS_KEY和VOLCENGINE_SECRET_KEY。对于仅需要上传输入文件的场景,TOS 凭证不再必须。
3. 检查输出路径:
output_tos_path为必填参数,必须由用户提供自己可写的 TOS 目录路径(格式:tos://bucket/output_dir/)。- 服务端需要将修复后的视频写入此目录。
4. 确认无误后:才能进入下一步。
Step 1: 初始化与准备
环境初始化(Agent 必做):
# 执行统一的环境初始化与更新脚本(会自动创建/激活虚拟环境,并检查更新)
source "$(dirname "$0")/scripts/env_init.sh" las_video_inpaint
workdir=$LAS_WORKDIR如果网络问题导致更新失败,脚本会跳过检查,使用本地已安装的 SDK 继续执行。
- 处理本地文件时:使用 File API 上传(只需
LAS_API_KEY,无需 TOS 凭证和 Bucket):
lasutil file-upload <local_path>上传成功后返回 JSON,取其中的 presigned_url(HTTPS 预签名下载链接,24 小时有效)传给算子作为输入 URL。
Step 2: 预估价格(⚠️ 必须获得用户确认)
1. 读取 references/prices.md 获取最新计费标准。 2. 获取视频时长:
lasutil media-duration <video_url>3. 根据时长和模式单价计算总价,将计费单价与预估总价一并告知用户并强制暂停执行,明确等待用户回复确认。在用户明确回复"继续"、"确认"等同意指令前,绝对禁止进入下一步(执行/提交任务)。提示:预估仅供参考,实际以火山账单为准。计费说明请参考 Volcengine LAS 定价。
Step 3: 提交任务 (Submit)
构造基础 data.json:
{
"video_url": "<presigned_url>",
"output_tos_path": "tos://<your-bucket>/output_dir/",
"targets": ["watermark", "subtitle"]
}重要提示: output_tos_path 必须由用户提供,需要填写用户自己账号下可写的 TOS 目录(服务端会将修复后的视频写入此目录)。单文件提交:
data=$(cat "$workdir/data.json")
lasutil submit las_video_inpaint "$data" > "$workdir/submit.json"⚠️ 强制反馈:任务提交成功后,必须立即向用户返回生成的 `task_id`,以便用户跟踪进度或在必要时手动查询。
Step 4: 异步查询 (Poll)
⚠️ 异步任务与后台轮询约束:
- 如果你当前的环境支持后台任务/异步长效运行:你可以利用环境提供的后台能力(例如发起后台轮询任务),并在任务完成后主动将结果返回给用户。
- 如果你当前的环境不支持长效后台任务(如普通的单轮对话沙箱),且直接
sleep循环会导致超时崩溃:绝对禁止在代码中执行死循环等待! 此时必须立即向用户输出 Task ID 并结束当前轮次,告知用户:"任务已提交,请稍后向我询问进度"。
单任务查询:
lasutil poll las_video_inpaint {task_id}COMPLETED→ 返回修复后视频路径result.data.inpainted_video_path。RUNNING/PENDING→ 稍后重试。
Step 5: 结果呈现
处理结果:
# 获取修复后的视频 URL
inpainted_url=$(cat "./output/{task_id}/result.json" | jq -r '.data.inpainted_video_path')
echo "修复后的视频: $inpainted_url"视频文件:
- 修复后的视频已保存在 TOS,直接返回预签名 URL
- 无需再次上传
向用户展示: 1. 修复后的视频下载链接 2. 本地结果路径:./output/{task_id}/ 3. 计费声明
审查标准
执行完成后,Agent 应自检: 1. 环境变量是否正确配置 2. 输入文件是否成功上传 3. 输出结果是否正确呈现给用户 4. 计费声明是否包含
byted-las-video-inpaint 自检清单(Skill Hub)
- SKILL.md 顶部包含 YAML frontmatter(name/description),且无多余分隔符
- 文档不包含任何真实密钥、Token、Cookie(只引用
LAS_API_KEY环境变量名) - 示例命令均可复制执行,且推荐用
lasutil <子命令> -h核对参数含义 - 批处理示例使用独立 workdir,并支持大批量按 batch_001/batch_002 分批隔离
- 常见问题覆盖
state.jsonl task_id 为 null、$RANDOM不可用等环境差异 - skill 目录内不包含临时文件(如
__pycache__、.DS_Store、大体积输出文件)
{
"skill_name": "byted-las-video-inpaint",
"evals": [
{
"id": 1,
"prompt": "我有一个带水印的视频(tos://bucket/input/watermark.mp4),帮我用 lasutil 提交修复任务并告诉我怎么轮询拿到输出的 inpainted_video_path。输出要包含完整命令和关键字段说明。",
"expected_output": "给出 data.json 模板、lasutil submit/poll 命令,解释 COMPLETED 后从 data.inpainted_video_path 获取结果。",
"files": []
},
{
"id": 2,
"prompt": "我有一个 TOS 目录 tos://bucket/input/ 下面很多 mp4,需要批量去水印。请给出可分批的 batch-submit/batch-poll 流程(含 workdir/batch_001 目录组织),并提醒我用 -h 查看参数含义。",
"expected_output": "给出 tos-ls 生成总清单、按批次子目录切分、batch-submit/batch-poll 示例命令,说明 jobs/interval/progress-interval/max-seconds 的含义与用法。",
"files": []
},
{
"id": 3,
"prompt": "我只有本地文件 ./input.mp4,想要最终输出落到本地 ./output.mp4,但算子只能写 TOS。请给出上传、提交、轮询、下载的完整步骤。",
"expected_output": "使用 lasutil tos-upload 上传到 TOS,中转 output_tos_path,完成后用 lasutil tos-download 下载到本地。",
"files": []
}
]
}
# Copyright (c) 2025 Beijing Volcano Engine Technology Co., Ltd. and/or its affiliates.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
las_video_inpaint API 参考
las_video_inpaint 为异步算子:先 submit 获取 task_id,再 poll 轮询直到 COMPLETED/FAILED。
Base / Region
- API Base:
https://operator.las.<region>.volces.com/api/v1 - Region:
cn-beijingcn-shanghai- 鉴权:
Authorization: Bearer $LAS_API_KEY
Submit 请求体
| 字段名 | 类型 | 是否必选 | 说明 |
|---|---|---|---|
| operator_id | string | 是 | 固定为 las_video_inpaint(CLI 自动填充) |
| operator_version | string | 是 | 固定为 v1(CLI 自动填充) |
| data | VideoInpaintUserReqParams | 是 | `data.json` 的内容对应此字段,详情见下 |
VideoInpaintUserReqParams
| 字段名 | 类型 | 是否必选 | 说明 |
|---|---|---|---|
| video_url | string | 是 | 视频下载地址(http/https 或 tos://) |
| output_tos_path | string | 是 | 修复结果写入的 TOS 路径前缀(建议传目录前缀)。最终输出以 inpainted_video_path 为准 |
| targets | array<string> | 否 | watermark/subtitle/scrolling_subtitle,默认 ["watermark","subtitle"] |
| return_subtitle_bbox | boolean | 否 | 是否返回字幕 bbox,默认 true |
| detection_precise_mode | boolean | 否 | 是否启用精确检测模式 |
| inpainting_backend | string | 否 | pixel_replace/pixel_generate,默认 pixel_replace |
| max_process_frames | integer | 否 | 最大处理帧数,-1 表示不限制 |
| subtitle_mask_precise | boolean | 否 | 是否启用精确字幕遮罩 |
| fixed_bboxes | array<array<int>> | 否 | 固定修复区域:[x1,y1,x2,y2],以 1000x1000 为基准 |
Poll 请求体
| 字段名 | 类型 | 是否必选 | 说明 |
|---|---|---|---|
| operator_id | string | 是 | 固定为 las_video_inpaint(CLI 自动填充) |
| operator_version | string | 是 | 固定为 v1(CLI 自动填充) |
| task_id | string | 是 | submit 返回的任务 ID(CLI 自动填充) |
Poll 响应体(摘要)
| 字段名 | 类型 | 备注 |
|---|---|---|
| metadata.task_status | string | PENDING/RUNNING/COMPLETED/FAILED/TIMEOUT |
| data.inpainted_video_path | string | 修复后视频的 TOS 地址 |
| data.subtitle_bbox | string | 字幕 bbox(如果返回),格式 x1,y1,x2,y2 |
计费说明(价格参考)
| 支持的地域 | 算子服务 & 模型名称 | 条件 | 单价 |
|---|---|---|---|
| 华北2(北京) 华东2(上海) | \* 算子服务:视频修复(las_video_inpaint) | 普通检测模式-pixel_replace修复模式,即:inpainting_backend=pixel_replace 且 detection_precise_mode=false | 1.2 元/分钟 |
| <br /> | <br /> | 普通检测模式-pixel_generate修复模式,即:inpainting_backend=inpaint_generate 且 detection_precise_mode=false | 1.6 元/分钟 |
| <br /> | <br /> | 精准检测模式-pixel_replace修复模式,即:inpainting_backend=pixel_replace 且 detection_precise_mode=true | 2.8 元/分钟 |
| <br /> | <br /> | 精准检测模式-pixel_generate修复模式,即inpainting_backend=inpaint_generate 且 detection_precise_mode=true | 3.2 元/分钟 |
#!/bin/bash
# ==============================================================================
# 视频格式预检查
# Usage: scripts/check_format.sh <file_path>
# ==============================================================================
FILE_PATH="$1"
if [ -z "$FILE_PATH" ]; then
echo "❌ 错误: 请提供文件路径"
exit 1
fi
# 获取文件扩展名并转小写
EXT=$(echo "$FILE_PATH" | awk -F. '{print tolower($NF)}')
# 允许的视频格式
ALLOWED_FORMATS="mp4 wmv avi mkv mov flv webm mpg mpeg"
if [[ " $ALLOWED_FORMATS " =~ " $EXT " ]]; then
echo "✅ 格式检查通过: $EXT"
exit 0
else
echo "⚠️ 警告: 文件扩展名 '$EXT' 不在推荐格式列表中"
echo " 推荐格式: $ALLOWED_FORMATS"
echo " 请确认输入格式正确"
exit 1
fi
#!/bin/bash
# ==============================================================================
# LAS SDK & Skill 环境初始化与更新脚本
# 用法: source scripts/env_init.sh <operator_id>
# ==============================================================================
OPERATOR_ID=$1
if [ -z "$OPERATOR_ID" ]; then
echo "❌ 错误: 必须提供 operator_id"
return 1 2>/dev/null || exit 1
fi
# 1. 虚拟环境隔离
# Find project root dynamically, then check for .las_venv
# skill structure: <project_root>/skills/<skill>/scripts/env_init.sh
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
# 优先复用项目根目录的虚拟环境,不存在才创建新的
if [ -d "${PROJECT_ROOT}/.las_venv" ]; then
source "${PROJECT_ROOT}/.las_venv/bin/activate"
elif [ ! -d ".las_venv" ]; then
python3 -m venv .las_venv
source .las_venv/bin/activate
else
source .las_venv/bin/activate
fi
# 2. 获取远程 manifest
manifest_url="https://las-ai-cn-beijing-online.tos-cn-beijing.volces.com/operator_cards_serving/public/skills/sdk/manifest.json"
manifest=$(curl -sf "$manifest_url" || echo '{}')
# 3. 比较 SDK 版本并自动更新
local_ver=$(lasutil --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' || echo "0.0.0")
remote_ver=$(echo "$manifest" | jq -r '.sdk_version // "unknown"')
if [ "$local_ver" = "0.0.0" ] || [ "$local_ver" != "$remote_ver" ]; then
echo "📦 SDK 更新: $local_ver → $remote_ver,正在安装..."
pip install --quiet --upgrade https://las-ai-cn-beijing-online.tos-cn-beijing.volces.com/operator_cards_serving/public/skills/sdk/las_sdk-0.2.0-py3-none-any.whl
fi
# 4. 检查当前算子的参数变更
op_changes=$(echo "$manifest" | jq -r ".operators.${OPERATOR_ID}.changes_since // {} | to_entries[] | \" 自 \(.key) 起: \(.value[])\"" 2>/dev/null)
if [ -n "$op_changes" ]; then
echo "⚠️ 算子 ${OPERATOR_ID} 有参数更新:"
echo "$op_changes"
echo "建议使用 find-skills 检索并更新此 skill 到最新版本。"
fi
# 5. 初始化工作目录
export LAS_WORKDIR=$(mktemp -d /tmp/las_work_XXXXXX)
echo "✅ 环境初始化完成,工作目录: $LAS_WORKDIR"
#!/bin/bash
# ==============================================================================
# 生成结果展示 markdown 模板,自动包含计费声明
# Usage: scripts/generate_result.md.sh <task_id> <output_dir> <estimated_price>
# ==============================================================================
TASK_ID="$1"
OUTPUT_DIR="$2"
ESTIMATED_PRICE="$3"
if [ -z "$TASK_ID" ] || [ -z "$OUTPUT_DIR" ]; then
echo "❌ 错误: 参数不全"
exit 1
fi
STATUS=$(cat "${OUTPUT_DIR}/COMPLETED" 2>/dev/null || echo "UNKNOWN")
cat <<EOF
# ASR 识别结果
## 任务信息
- **任务 ID**: \`${TASK_ID}\`
- **最终状态**: \`${STATUS}\`
EOF
if [ -n "$ESTIMATED_PRICE" ]; then
cat <<EOF
- **预估计费**: ${ESTIMATED_PRICE} 元
EOF
fi
if [ -f "${OUTPUT_DIR}/transcript.txt" ]; then
TEXT_LEN=$(wc -c < "${OUTPUT_DIR}/transcript.txt")
DURATION_MS=$(cat "${OUTPUT_DIR}/result.json" | jq -r '.data.audio_info.duration // 0')
DURATION_MIN=$(echo "scale=1; $DURATION_MS / 1000 / 60" | bc)
LANG=$(cat "${OUTPUT_DIR}/result.json" | jq -r '.data.result.additions.lid_lang // "unknown"')
cat <<EOF
## 识别统计
- **音频时长**: ${DURATION_MIN} 分钟
- **识别语种**: ${LANG}
- **总字数**: ${TEXT_LEN} 字符
## 文本预览(前 500 字)
\`\`\`
$(head -c 500 "${OUTPUT_DIR}/transcript.txt")
\`\`\`
EOF
fi
cat <<EOF
## 结果文件位置
\`${OUTPUT_DIR}/\`
- \`result.json\` - 完整 API 响应
- \`transcript.txt\` - 完整识别文本
EOF
if [ -f "${OUTPUT_DIR}/utterances.csv" ]; then
cat <<EOF
- \`utterances.csv\` - 分句说话人信息(CSV格式)
- \`utterances.json\` - 分句原始数据
EOF
fi
cat <<'EOF'
---
本方式的计费均为预估计费,与实际费用有差距,实际费用以运行后火山产生的账单为准。计费说明请参考 [Volcengine LAS 定价](https://www.volcengine.com/docs/6492/1544808)。
EOF
#!/bin/bash
# ==============================================================================
# 后台轮询脚本 - 动态间隔
# Usage: scripts/poll_background.sh <task_id> [output_dir]
# ==============================================================================
TASK_ID="$1"
OUTPUT_DIR="${2:-output/${TASK_ID}}"
if [ -z "$TASK_ID" ]; then
echo "❌ 错误: 请提供 task_id"
exit 1
fi
# 加载环境
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
if [ -f "${PROJECT_ROOT}/.env" ]; then
source "${PROJECT_ROOT}/.env"
export LAS_API_KEY LAS_REGION
fi
# 激活虚拟环境
if [ -d "${PROJECT_ROOT}/.las_venv" ]; then
source "${PROJECT_ROOT}/.las_venv/bin/activate"
fi
OPERATOR_ID="las_video_inpaint"
mkdir -p "${OUTPUT_DIR}"
echo "$(date): Starting background polling for task ${TASK_ID}" >> "${OUTPUT_DIR}/poll.log"
# 轮询计数,用于动态调整间隔
ATTEMPT=0
# Poll until terminal state
while true; do
((ATTEMPT++))
# 动态调整轮询间隔:
# - 前 5 次: 60秒
# - 5-10 次: 120秒
# - 10次之后: 300秒(长视频理解时间更长)
if [ $ATTEMPT -le 5 ]; then
SLEEP=60
elif [ $ATTEMPT -le 10 ]; then
SLEEP=120
else
SLEEP=300
fi
# Save full response first, then extract status
FULL_OUTPUT=$(lasutil poll "${OPERATOR_ID}" "${TASK_ID}")
echo "$FULL_OUTPUT" > "${OUTPUT_DIR}/last_poll.json"
# Extract status
STATUS=$(echo "$FULL_OUTPUT" | python3 -c "
import json
import sys
try:
data = json.load(sys.stdin)
print(data['metadata']['task_status'])
except Exception as e:
print('ERROR')
")
echo "$(date): Attempt $ATTEMPT, status = ${STATUS}, next poll in ${SLEEP}s" >> "${OUTPUT_DIR}/poll.log"
if [ "$STATUS" = "COMPLETED" ] || [ "$STATUS" = "FAILED" ] || [ "$STATUS" = "TIMEOUT" ] || [ "$STATUS" = "CANCELED" ]; then
# Save final result
echo "$FULL_OUTPUT" > "${OUTPUT_DIR}/result.json"
# Create completion flag
echo "$STATUS" > "${OUTPUT_DIR}/COMPLETED"
echo "$(date): Poll completed, final status = ${STATUS}" >> "${OUTPUT_DIR}/poll.log"
exit 0
fi
sleep "$SLEEP"
done
Related skills
FAQ
What is the maximum video size?
It handles videos up to 4 hours in length and 30GB in size.
Where does the repaired video go?
The service writes it to an output_tos_path TOS directory that the user must provide.