
之前一直在折腾视频剪辑和素材整理的流程剪一段片子往往要同时打开剪辑软件、字幕工具、云盘目录先看时长再找时间点最后还要手动整理成文档整套动作重复且耗时。后来我把 Grok Bot 智能体接到自建的视频处理服务上实现了“一句话完成视频剪辑与整理”只要告诉智能体“把第 2 分钟到第 3 分钟截出来生成一段 30 秒的短视频并输出这段内容的要点”它就能自动解析意图、调用剪辑工具、返回可下载的视频文件同时生成整理文档。本文把这套方案的完整思路、架构设计、代码实现和平台配置过程整理出来适合正在做智能体落地、想接入视频处理能力的开发者参考。1. Grok Bot 智能体到底是什么在搭建方案之前先要把概念理清楚。很多人一看到“智能体”三个字就以为是一个独立的聊天机器人或者某个 App其实智能体更准确的理解是以大语言模型为大脑通过“思考 - 决策 - 调用工具 - 完成任务”这样的循环去解决真实业务问题的程序系统。1.1 智能体的朴素理解我们可以把智能体拆成三个部分来看大脑大语言模型负责理解用户说的话、拆解任务、生成下一步动作Grok Bot 中的 Grok 就是承担这个角色的大模型。工具真正干活的模块比如视频剪辑服务、文件读写接口、数据库查询接口、第三方 API。大模型本身不会剪视频但它知道“什么时候调用哪个工具、传什么参数进去”。编排把大脑和工具连接起来的流程常见形式包括提示词Prompt、工具注册表、状态记忆、多轮对话管理。用一句话概括智能体 大模型 工具 执行流程。1.2 Grok Bot 在智能体中的位置Grok Bot 可以理解为一类基于 Grok 大模型构建的对话式智能体。它并不局限于单个产品形态你可以把它接入到 Dify、Coze 这类智能体开发平台也可以在代码里通过模型 API 直接调用。在本文方案中Grok Bot 负责的是“指挥官”角色它接收用户的一句话指令例如帮我把 meeting.mp4 的 00:01:30 到 00:02:15 剪出来 转成 720p然后根据这段内容写一段 100 字的摘要。Grok Bot 会先识别出输入文件meeting.mp4起始时间00:01:30结束时间00:02:15操作类型剪辑 转码 摘要输出要求720p100 字摘要然后把操作参数整理成 JSON调用我们提前注册好的“视频处理工具”等工具返回结果后再组织成自然语言回复给用户。1.3 智能体与普通 ChatBot 的差异普通 ChatBot 的能力边界在“对话”里它能回答问题、生成文本但无法对现实世界产生动作。智能体的关键差异在于它具备工具调用能力也就是通常说的 Function Calling / Tool Calling。举个例子普通 ChatBot用户问“帮我看看服务器磁盘”它只能回复“你可以执行 df -h 命令”。智能体用户说“帮我看看服务器磁盘”它会直接调用磁盘查询工具返回当前磁盘使用率并根据结果判断是否需要告警。这个差异决定了我们能不能用 Grok Bot 完成真实的视频剪辑任务而不是只得到一段“剪辑教程”。1.4 智能体与 Skill 的区别在智能体平台中经常看到“技能Skill”和“智能体Agent”两个概念。Skill 更偏向于一个可复用的能力单元比如“提取视频关键帧”是一个 Skill“帮我分析这段视频并生成剪辑方案”是一个完整的智能体任务。智能体往往会组合多个 Skill再加上对话逻辑、记忆和决策策略。因此在设计时建议先把视频剪辑、音频提取、信息整理等能力拆成独立模块再由 Grok Bot 智能体按需调度。2. “一句话完成视频剪辑与整理”需求拆解明确概念之后要把业务需求转成技术方案。这一步决定了代码怎么写、平台怎么配。2.1 业务场景描述我假设一个非常常见的场景运营同学经常要处理会议录屏、直播回放、课程视频需要快速截取片段然后根据片段内容输出摘要或剪辑说明。传统做法是用剪辑软件打开视频。拖动进度条找到起始点和结束点。执行剪辑并导出。再打开文档工具写摘要。整套流程依赖人工操作而且短视频素材一多时间成本成倍增加。本文目标是通过 Grok Bot 智能体把以上流程压缩成一句话把 input/live.mp4 从 00:05:00 剪到 00:06:30 分辨率改成 1280x720 然后根据裁剪出来的内容生成一份剪辑说明文档。智能体收到指令后需要完成理解任务识别这是一个视频处理请求。解析参数路径、起始时间、结束时间、分辨率。调用工具调用视频剪辑服务。整理结果读取处理后视频的信息生成结构化输出。2.2 系统架构设计整个系统分为三层层级组件职责交互层Grok Bot 智能体接收用户自然语言、拆解任务、调用工具、组织回复编排层Dify / Coze 等平台管理模型、工具、提示词、对话状态执行层Python FFmpeg 服务真正执行视频剪辑、转码、信息读取、文档生成为什么不把视频剪辑逻辑直接写进智能体代码里因为平台型智能体更适合做模型管理和工具编排而视频处理涉及大量系统命令和文件 IO单独做成服务更好维护也能被其他系统复用。2.3 为什么选择 Dify / Coze 这类平台在技术选型时自研智能体框架和直接使用平台是两条路线。自研方案灵活性最高但需要自己维护模型接入、对话管理、工具调用协议。如果你有 Java 项目或 Python 项目需要嵌入智能体能力可以直接用 LangChain 或自写 Function Calling 逻辑。平台方案上手快Dify、Coze 这类平台已经封装好了 Agent 模型编排、OpenAPI 工具接入、日志追踪、发布管理适合先跑通业务流程。本文选择 Dify 作为演示平台因为它的自定义工具接入方式比较通用也能在社区版本中本地部署。3. 环境准备与版本说明开始写代码前先把运行环境准备好。由于 Grok 模型 API 和 Dify 平台版本更新较快下面的版本信息只作为参考请以你实际使用的版本为准。3.1 操作系统与基础环境操作系统Ubuntu 22.04 LTSWindows / macOS 也可命令略有差异Python3.10 或更高版本包管理工具pip视频处理工具FFmpeg智能体平台Dify 社区版或云端版模型Grok 模型 API具体名称以平台接入页为准3.2 安装 FFmpegFFmpeg 是视频处理的核心工具。在 Ubuntu 上安装sudo apt update sudo apt install ffmpeg -y安装完成后验证ffmpeg -version如果输出版本信息说明安装成功。在 Windows 上可以下载 FFmpeg 可执行文件并配置环境变量也可以使用包管理器安装。3.3 安装 Python 依赖我们使用 Flask 暴露 REST API方便智能体平台通过 HTTP 调用。创建虚拟环境并安装依赖mkdir grok-video-agent cd grok-video-agent python3 -m venv venv source venv/bin/activate pip install flask requests然后把依赖记录到 requirements.txtpip freeze requirements.txt3.4 准备测试视频在项目目录下创建一个input文件夹放入一个测试视频文件比如live.mp4。这个视频将作为智能体剪切的素材。mkdir -p input output后续工具服务只允许操作这两个目录避免任意路径访问。4. 搭建视频处理工具服务这一节进入核心代码部分。视频处理服务需要提供三个能力读取视频信息获取时长、分辨率、编码等元数据。视频剪辑截取指定时间段可调整分辨率。内容整理根据元数据和用户输入生成结构化文档。下面逐块实现。4.1 项目结构grok-video-agent/ ├── app.py # Flask 主服务 ├── video_tool.py # 视频处理核心逻辑 ├── requirements.txt ├── input/ │ └── live.mp4 └── output/4.2 实现视频处理核心逻辑创建video_tool.py封装 FFmpeg 调用。这里强调一个安全原则不要用字符串拼接命令而是用列表形式传给 subprocess避免路径中有空格或特殊字符时出错也避免命令注入风险。# 文件路径video_tool.py import json import os import subprocess INPUT_DIR os.path.join(os.path.dirname(__file__), input) OUTPUT_DIR os.path.join(os.path.dirname(__file__), output) def get_video_info(filename: str) - dict: 读取视频文件信息返回时长、分辨率、编码等信息。 safe_path resolve_input_path(filename) if not safe_path: raise ValueError(文件不存在或不在允许目录内) cmd [ ffprobe, -v, quiet, -print_format, json, -show_format, -show_streams, safe_path, ] result subprocess.run(cmd, capture_outputTrue, textTrue, checkTrue) data json.loads(result.stdout) video_stream None for stream in data.get(streams, []): if stream.get(codec_type) video: video_stream stream break if not video_stream: raise ValueError(未找到视频流) return { filename: filename, duration: float(data.get(format, {}).get(duration, 0)), width: video_stream.get(width), height: video_stream.get(height), codec: video_stream.get(codec_name), bit_rate: data.get(format, {}).get(bit_rate), } def cut_video( filename: str, start_time: str, end_time: str None, resolution: str None, output_filename: str None, ) - dict: 截取视频片段支持指定时间段和分辨率。 safe_input resolve_input_path(filename) if not safe_input: raise ValueError(文件不存在或不在允许目录内) output_filename output_filename or fcut_{start_time.replace(:, -)}.mp4 safe_output os.path.join(OUTPUT_DIR, output_filename) cmd [ffmpeg, -y, -i, safe_input, -ss, start_time] if end_time: cmd [-to, end_time] if resolution: cmd [-vf, fscale{resolution}] cmd [-c:a, copy, safe_output] subprocess.run(cmd, capture_outputTrue, textTrue, checkTrue) return { status: success, output_path: safe_output, output_filename: output_filename, } def resolve_input_path(filename: str) - str: 将传入的文件名解析为绝对路径并限制在 input 目录内。 safe_path os.path.abspath(os.path.join(INPUT_DIR, filename)) if not safe_path.startswith(os.path.abspath(INPUT_DIR)): raise ValueError(非法路径) if not os.path.exists(safe_path): raise ValueError(文件不存在) return safe_path这里的resolve_input_path做了路径防御避免用户传入../../etc/passwd这类路径去读取系统文件。生产项目建议把文件白名单和权限控制做得更细。4.3 实现 Flask 接口创建app.py把上面的逻辑暴露成 HTTP 接口。# 文件路径app.py from flask import Flask, jsonify, request import video_tool app Flask(__name__) app.post(/api/v1/video/info) def video_info(): 获取视频信息。请求体{filename: live.mp4} data request.get_json(forceTrue) filename data.get(filename) try: info video_tool.get_video_info(filename) return jsonify({code: 0, data: info}) except Exception as exc: return jsonify({code: 1, message: str(exc)}), 400 app.post(/api/v1/video/cut) def video_cut(): 剪切视频。请求体{filename: live.mp4, start_time: 00:01:30, end_time: 00:02:15, resolution: 1280x720} data request.get_json(forceTrue) try: result video_tool.cut_video( filenamedata.get(filename), start_timedata.get(start_time), end_timedata.get(end_time), resolutiondata.get(resolution), output_filenamedata.get(output_filename), ) return jsonify({code: 0, data: result}) except Exception as exc: return jsonify({code: 1, message: str(exc)}), 400 app.post(/api/v1/video/description) def video_description(): 生成视频内容整理文档。请求体{filename: live.mp4, start_time: 00:01:30, end_time: 00:02:15, note: 用户补充说明} data request.get_json(forceTrue) filename data.get(filename) start_time data.get(start_time, ) end_time data.get(end_time, ) note data.get(note, ) try: info video_tool.get_video_info(filename) description ( f视频文件{filename}\n f视频总时长{info[duration]} 秒\n f分辨率{info[width]}x{info[height]}\n f剪辑范围{start_time} - {end_time}\n f用户备注{note}\n f说明本片段由 Grok Bot 智能体自动剪辑生成 f详见输出目录中的视频文件。 ) return jsonify({code: 0, data: {description: description}}) except Exception as exc: return jsonify({code: 1, message: str(exc)}), 400 if __name__ __main__: app.run(host0.0.0.0, port8000)这里的视频整理接口目前是比较简单的模板输出。如果你接入了语音转文字模型可以在这里扩展先提取音频再调用 ASR 服务生成转录文本最后让智能体基于转录文本写摘要效果会更好。4.4 启动服务并验证启动 Flask 服务python app.py在另一个终端测试视频信息接口curl -X POST http://127.0.0.1:8000/api/v1/video/info \ -H Content-Type: application/json \ -d {filename: live.mp4}预期输出是一个 JSON包含时长、分辨率、编码等信息。再测试剪切接口curl -X POST http://127.0.0.1:8000/api/v1/video/cut \ -H Content-Type: application/json \ -d {filename: live.mp4, start_time: 00:01:30, end_time: 00:02:15}执行成功后output目录下会生成对应的 mp4 文件。5. 在 Dify 中创建 Grok Bot 智能体后端服务就绪后接下来在 Dify 平台中创建智能体应用把 Grok 模型和视频处理工具关联起来。5.1 创建一个空白应用登录 Dify 后在应用列表点击“创建应用”选择“聊天助手”或“Agent”类型。不同版本的入口名称可能不同如果看到 Agent / 智能体应用类型就选择它。应用名称建议写成Grok 视频剪辑助手方便后续识别。5.2 配置 Grok 模型在应用设置中找到“模型”或“系统模型”配置选择 Grok 模型。如果你在模型列表中找不到 Grok 选项通常有两种办法在平台“模型供应商”中添加 Grok 的 API Key。通过自定义模型接入 OpenAI 兼容协议的方式配置。不同模型对工具调用Function Calling的支持程度不同务必确认所选模型支持工具调用能力否则智能体无法正确生成工具参数。5.3 导入视频处理工具Dify 支持通过 OpenAPI schema 导入自定义工具。把我们上面的三个接口整理成openapi.yamlopenapi: 3.0.0 info: title: Video Processing Tool description: 提供视频信息读取、视频剪切、视频整理能力 version: 1.0.0 servers: - url: http://your-server-ip:8000 paths: /api/v1/video/info: post: summary: 获取视频信息 operationId: getVideoInfo requestBody: required: true content: application/json: schema: type: object properties: filename: type: string description: 视频文件名文件需位于 input 目录 responses: 200: description: 视频信息 /api/v1/video/cut: post: summary: 剪切视频 operationId: cutVideo requestBody: required: true content: application/json: schema: type: object properties: filename: type: string start_time: type: string description: 起始时间格式 00:01:30 end_time: type: string description: 结束时间格式 00:02:15 resolution: type: string description: 输出分辨率例如 1280x720 output_filename: type: string description: 输出文件名 responses: 200: description: 剪辑结果 /api/v1/video/description: post: summary: 生成视频整理说明 operationId: getVideoDescription requestBody: required: true content: application/json: schema: type: object properties: filename: type: string start_time: type: string end_time: type: string note: type: string description: 用户补充说明 responses: 200: description: 整理文档在 Dify 的自定义工具页面选择“导入 OpenAPI 规范”把上面的 YAML 粘贴进去。导入后Dify 会识别出三个工具方法getVideoInfo、cutVideo、getVideoDescription。注意servers.url里的地址需要是 Dify 能访问到的地址。如果你是本地开发可以使用局域网 IP如果是云端 Dify需要把服务部署到公网可访问的位置或者使用内网穿透方案这里只讨论正常业务部署相关网络配置请遵循平台规范。5.4 编写系统提示词智能体的行为取决于提示词设计。在应用的“提示词”区域建议编写如下系统提示词你是一个视频处理助手负责帮助用户完成视频剪辑和内容整理。 你可以使用的工具 1. getVideoInfo获取视频基本信息包括时长、分辨率、编码。 2. cutVideo剪切视频片段可以指定开始时间、结束时间、输出分辨率。 3. getVideoDescription生成视频整理说明。 使用规则 - 当用户提到视频文件时先确认文件名是否在 input 目录中。 - 当用户给出时间点时要转换为 HH:MM:SS 格式例如 2分30秒 要写成 00:02:30。 - 当用户要求剪辑视频时调用 cutVideo 工具。 - 当用户要求整理或总结时调用 getVideoDescription 工具。 - 如果用户没有明确文件名主动询问不要猜测。 - 工具调用完成后用简洁的中文向用户说明结果。这段提示词的关键在于明确工具边界避免模型自己编造不存在的接口。规定时间格式转换减少参数解析错误。规定未知信息需要反问而不是猜一个文件名。5.5 发布并测试保存配置后在调试对话框里输入一句话帮我把 live.mp4 从 00:01:30 剪到 00:02:15并生成一段整理说明。如果一切正常你会看到 Grok Bot 先调用getVideoInfo获取视频信息再调用cutVideo执行剪切最后调用getVideoDescription生成说明然后汇总结果回复。6. 一次完整的“一句话剪辑”演示为了更直观地展示效果下面给出一个完整的交互链路。用户输入帮我处理一下 input 里的 live.mp4把 00:03:20 到 00:04:00 截出来 输出 1280x720然后写一段 50 字左右的摘要说明。Grok Bot 的思考过程大致是确定操作对象live.mp4。确定操作类型剪切 调整分辨率 生成摘要。解析参数start_time 00:03:20end_time 00:04:00resolution 1280x720调用 cutVideo 工具传入上述参数。等待工具返回结果若成功则继续。调用 getVideoDescription传入文件名和时间段附加用户要求。汇总输出。最终 Grok Bot 回复示例已完成剪辑。 - 源文件live.mp4 - 剪切范围00:03:20 - 00:04:00 - 输出分辨率1280x720 - 输出文件output/cut_00-03-20.mp4 整理说明 本片段总时长 40 秒内容为直播中段的关键讲解部分。 用户备注需要用于短视频平台发布因此输出为 720p。从用户角度看整个过程真的只是一句话复杂的参数解析和工具调用都被 Grok Bot 自动处理了。如果把这套流程接到企业微信、钉钉、飞书机器人中运营同学直接在聊天窗口发送指令就能完成剪辑和整理这在实际项目中价值很高。7. 常见问题与排查思路在搭建过程中最容易遇到以下几类问题。问题现象常见原因解决思路Grok Bot 不调用工具只是回复文本模型不支持 Function Calling或提示词未说明工具更换支持工具调用的模型并在系统提示词中明确工具名称调用了工具但参数错误用户提供了口语化时间模型没有正确转换在提示词中增加时间格式转换规则并在工具描述中写明时间格式 HH:MM:SS视频剪切失败FFmpeg 未安装或视频编码不支持直接 copy检查 ffmpeg 命令是否能手动执行-c:a copy报错时可改为重新编码-c:a aac文件找不到文件名不一致或视频不在 input 目录先调用 getVideoInfo 列出 input 目录文件再让用户确认文件名接口返回 400请求参数缺少必填字段检查 OpenAPI schema 与 Flask 接口是否一致字段名是否匹配视频剪切后没有声音音频流编码与-c:a copy不兼容将音频参数改为-c:a aac重新编码工具地址无法访问Dify 部署环境无法访问本地服务地址采用可被 Dify 访问的部署地址并对视频服务做鉴权保护这里提一个容易忽略的坑FFmpeg 的-ss参数放在-i之前和之后行为不一样。放在-i之前是快速 seek定位速度快但时间点可能不够精确放在-i之后是精确 seek处理速度稍慢但定位准确。批量剪辑场景下建议根据精度要求选择合适的参数位置。# 快速 seek ffmpeg -ss 00:01:30 -i input.mp4 -to 00:02:15 -c copy output.mp4 # 精确 seek ffmpeg -i input.mp4 -ss 00:01:30 -to 00:02:15 -c copy output.mp4如果需要精确保留每一帧导出时建议重新编码ffmpeg -i input.mp4 -ss 00:01:30 -to 00:02:15 -c:v libx264 -c:a aac output.mp48. 最佳实践与工程建议智能体开发不能只看“能跑通”还要考虑稳定性、安全性和可维护性。以下建议来自工程落地的经验总结。8.1 把工具能力边界写清楚给智能体配置工具时每一个工具的描述都要写清楚这个工具是干什么的需要哪些参数参数格式是什么在什么情况下不应该调用这个工具模型是根据描述来决定调用时机的描述越清晰误调用越少。比如cutVideo的描述里明确“不要随意修改分辨率除非用户明确要求”会比简单写一句“剪切视频”稳定得多。8.2 对用户输入做参数校验模型生成的参数不一定每次都合法。在 Flask 接口层必须做参数校验时间格式是否符合 HH:MM:SS。分辨率是否在允许列表内。文件名是否包含危险字符。输出文件名是否规范。如果校验不通过接口要返回明确的错误信息帮助智能体修正参数而不是返回一段晦涩的堆栈。8.3 使用消息队列处理耗时任务视频剪辑属于耗时操作。一个 5 分钟的视频重新编码可能需要几十秒甚至更久如果 Flask 接口同步阻塞用户体验会很差也容易触发智能体平台超时。生产环境建议客户端调用接口后立即返回任务 ID。后端把任务写入消息队列由 Worker 异步处理。智能体通过另一个接口查询任务状态。任务完成后智能体再通知用户结果。RSS 系统的完整架构就会变成用户一句话 - Grok Bot 创建任务 - 异步剪辑 - 状态查询 - 结果返回。这比本文的同步实现更接近生产级方案。8.4 做好权限与安全隔离视频服务不要直接暴露在公网至少应该增加 API Key 鉴权。Dify 自定义工具支持在 Header 中携带认证信息可以在服务端验证请求来源。同时工具服务应运行在最小权限用户下只允许访问指定目录避免被恶意利用。8.5 从简单规则逐步迭代不要一开始做“全家桶”智能体的强大在于组合但复杂度也来自组合。建议先只接一个cutVideo工具跑通一条完整链路再逐步增加音频提取、字幕生成、内容摘要、多视频拼接等能力。每次新增工具都要回到提示词里补充对应的调用规则。工具一多模型可能出现选错工具的情况这时可以通过调整工具描述、增加示例对话来改善。8.6 保留日志与可观测性在接口层记录每次调用的入参、出参、耗时和错误信息。一旦智能体行为异常可以快速定位是模型理解错了还是工具执行失败了。日志格式建议采用 JSON 结构化输出方便接入日志平台分析和告警。9. 扩展方向从单智能体到多智能体当你把“一句话视频剪辑”跑通之后可以继续向多智能体方向扩展。比如一个完整的视频发布流程可以拆成多个角色剪辑智能体负责片段剪切、转码。整理智能体负责生成标题、摘要、标签。质检智能体负责检查视频分辨率、时长是否合规。发布智能体负责上传到内容平台。每个智能体各司其职通过流程编排串联起来。Dify、Coze 这类平台都提供了工作流编排能力你可以用节点把多个智能体和工具串成一条流水线让用户只发一次指令后面全自动执行。不过在扩展之前建议先把单智能体场景打磨好参数解析准确、工具调用稳定、错误处理清晰。多智能体只是把单点能力“拼接”起来基础不稳流程越长越容易出错。本文从概念、架构、代码、平台配置到排错和扩展完整走了一遍 Grok Bot 智能体落地“视频剪辑与整理”的流程。如果你正在做类似的知识库整理、内容生产自动化、文件处理类智能体这套“大模型 工具服务 编排平台”的套路是可以直接复用的。建议你按照第 4 节的代码把视频工具服务先跑起来再去平台上配一个最小的对话应用感受一次“一句话完成剪辑”的完整链路然后根据实际业务逐步叠加能力。