首页 / 资讯中心 / 文章详情

使用 VoltAgent 构建 YouTube 转博客 Agent:MCP 工具、共享记忆与 Supervisor 编排实战

使用 VoltAgent 构建 YouTube 转博客 Agent:MCP 工具、共享记忆与 Supervisor 编排实战 ★ FEATURED ARTICLE
人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆【免费下载链接】voltagentAI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework项目地址https://gitcode.com/gh_mirrors/vo/voltagent点击查看免费下载本文基于 VoltAgent 官方示例with-youtube-to-blog配套文档 website/examples/youtube-to-blog.md展开。它演示了一个YouTube 视频 → Markdown 博客文章的完整多 Agent 流水线一个 SupervisorYouTubeToBlogCoordinator通过内置的delegate_task工具调度TranscriptFetcher与BlogWriter两个子 Agent前者借助 MCPModel Context ProtocolHTTP SSE 端点调用 YouTube 字幕工具后者把字幕整理成结构化 Markdown 文章全过程共享 LibSQL 支撑的工作记忆并由 VoltOps 可观测性适配器记录每一次调用轨迹。读完本文你将掌握如何用MCPConfiguration接入远程 MCP 工具、如何用subAgentssupervisorConfig编排严格的执行顺序、如何用MemoryLibSQLMemoryAdapter在子 Agent 之间传递上下文以及如何通过 VoltAgent 的 Hono 服务器把整套 Agent 以 HTTP 服务形式暴露出来。示例概览一条由 Supervisor 主导的转录 → 写作流水线该示例的核心思路是职责分离 严格交接handoff不把抓字幕和写博客塞进同一个 Agent而是拆成两个专职子 Agent由一个 Supervisor 按固定顺序调度。这样每个 Agent 的指令都被约束到单一职责prompt 更短、行为更可控、也更便于在 VoltOps 控制台逐段观测。整个 Agent 在运行时依次完成五件事对应文档中的能力清单通过 MCP Server-Sent EventsSSE加载 YouTube 工具MCPConfiguration连接到YOUTUBE_MCP_URL指向的 HTTP SSE 端点把远程工具元数据转换为 VoltAgent 可直接使用的Tool[]将转录与写作委托给两个聚焦的 AgentTranscriptFetcher只负责提取英文字幕原文BlogWriter只负责把字幕改写成结构化的 Markdown 博客把字幕上下文存入 LibSQL 支撑的工作记忆Supervisor 无需在 prompt 中重复粘贴字幕直接从共享Memory读取即可传递给下一个子 Agent通过 VoltOps 可观测性适配器记录执行轨迹span、日志与工具事件被写入LibSQLObservabilityAdapter在 VoltOps Web 控制台渲染成可回放的时间线通过 VoltAgent 的 Hono 服务器集成对外提供服务new VoltAgent({ server: honoServer(), ... })在http://localhost:3141暴露 HTTP 接口。完整源码位于 examples/with-youtube-to-blog/src/index.tspackage.json的依赖揭示了这套架构的技术栈voltagent/coreAgent 与 MCP 核心、voltagent/libsql记忆与可观测性存储、voltagent/loggerPino 日志、voltagent/server-honoHTTP 服务以及aiAI SDK 运行时。环境准备与项目脚手架准备所需账号与服务开始之前需要准备以下资源文档原文要求VoltOps LLM 可观测性账号用于查看 Agent 调用轨迹与工具事件OpenAI API Key示例中的三个 Agent 默认都使用gpt-4o-mini模型可用的 YouTube MCP 服务器示例面向社区提供的 YouTube 字幕 MCP 服务如基于 SSE 的转录工具服务。需要注意社区服务器可能限流throttle文档建议准备一个备用的提供方。用 VoltAgent CLI 脚手架生成项目官方推荐通过 CLI 生成示例项目npm create voltagent-applatest -- --example with-youtube-to-blog cd with-youtube-to-blogcreate-voltagent-app会把模板项目、依赖声明与 TypeScript 配置一并生成。本仓库中对应的真实示例位于 examples/with-youtube-to-blog其package.json提供的脚本包括scripts: { build: tsc, dev: tsx watch --env-file.env ./src, start: node dist/index.js, volt: volt }dev用tsx watch以--env-file.env方式加载环境变量并热重载运行./src入口为src/index.tsstart运行tsc编译产物dist/index.jsvolt调用 VoltAgent CLI 的volt命令。tsconfig.json采用 ES2022 目标、NodeNext 模块解析与 strict 模式include只覆盖src目录。配置环境变量创建或复制一个.env文件填入凭证以下为文档中的完整模板# OpenAI Configuration OPENAI_API_KEYyour_openai_api_key # MCP Provider Configuration YOUTUBE_MCP_URLhttps://your-youtube-mcp-host/sse # VoltOps Observability (optional) VOLTAGENT_PUBLIC_KEYyour_public_key VOLTAGENT_SECRET_KEYyour_secret_key如果自托管 VoltOps 或 LibSQL还需要追加连接变量例如LIBSQL_DATABASE_URL与LIBSQL_AUTH_TOKEN。注意一个关键默认行为在不做额外配置的情况下LibSQL 适配器会在项目目录内创建本地 SQLite 文件也就是说示例开箱即可运行、无需真实数据库服务。这一点与源码一致——packages/libsql/src/memory-v2-adapter.ts 中LibSQLMemoryAdapter的默认数据库 URL 为file:./.voltagent/memory.db且当 URL 以file:开头时会自动创建数据库文件所在目录。启动开发服务器安装依赖后运行pnpm dev服务器启动后终端会打印如下横幅════════════════════════════════════════════ VOLTAGENT SERVER STARTED SUCCESSFULLY ════════════════════════════════════════════ ✓ HTTP Server: http://localhost:3141 VoltOps Platform: https://console.voltagent.dev ════════════════════════════════════════════ [VoltAgent] All packages are up to date开发过程中建议把 YouTube MCP 提供方作为独立进程单独运行这样TranscriptFetcher子 Agent 才能通过YOUTUBE_MCP_URL调用字幕工具。MCP 工具注册把远程 SSE 工具拉进 Agent示例在 Agent 启动之前就完成了工具发现文档原文const youtubeMcpConfig new MCPConfiguration({ servers: { youtube: { type: http, url: process.env.YOUTUBE_MCP_URL || , }, }, }); const youtubeTools await youtubeMcpConfig.getTools();这里有两层含义MCPConfiguration从 HTTP SSE 端点拉取工具元数据并转换为 VoltAgent 期望的格式getTools()返回一个扁平的、Agent 可直接调用的Tool[]数组。得到的youtubeTools数组被直接传入各 Agent 的tools字段无需任何额外接线。YOUTUBE_MCP_URL必须能被 VoltAgent 进程访问并且端点要暴露文档所描述的 SSE 接口即 MCP 的 HTTP/SSE 传输协议。从源码看MCPConfiguration是 packages/core/src/mcp/registry/index.ts 中一个独立的配置管理器它内部按服务器名维护一份MCPClient本地缓存getTools(authContext?)并行连接所有配置的服务器调用client.getAgentTools()后扁平化为单个工具数组工具名会以${serverName}_${originalName}形式做命名空间前缀避免多服务器工具重名冲突此外还提供getRawTools()、getToolsets()、getRawToolsets()、getClient(name)、getClients()与disconnect()等 API用于按需获取原始工具定义、按服务器分组的工具集或管理连接生命周期构造时可传入authorization配置配合filterOnDiscovery与can回调在工具发现阶段按用户上下文过滤可用工具。因此一个MCPConfiguration实例可以同时托管多个 MCP 服务器在servers下按名称注册本示例只注册了youtube一个。需要注意的是该实现不会自动管理单例——每个实例管理自己的连接缓存若使用多个实例连接与断开都需要按实例分别处理。Agent 架构三 Agent 协作与严格交接当用户请求一篇博客文章时YouTubeToBlogCoordinator接收包含 YouTube 链接的 prompt并遵循严格的交接顺序文档原文Step 1——获取字幕Coordinator 调用TranscriptFetcher子 Agent后者依赖 MCP 字幕工具拉取完整字幕文本Step 2——生成博客字幕落入共享记忆后Coordinator 调用BlogWriter子 Agent并把完整字幕作为输入传入Step 3——原样返回Writer 返回 MarkdownCoordinator 把这份 Markdown 原样作为自己的响应便于下游系统直接存储或发布。为支撑这条流水线示例在同一个 VoltAgent 实例内注册了三个 AgentSupervisor 协调两个子 Agent三者共享同一份memory与日志、可观测性资源。TranscriptFetcher 子 Agent只取原文不做加工TranscriptFetcher负责从 YouTube MCP 工具拉取原始字幕文档代码与仓库 examples/with-youtube-to-blog/src/index.ts 中的实现一致const transcriptFetcherAgent new Agent({ name: TranscriptFetcher, instructions: You are a transcript fetcher. Your ONLY job is to fetch transcripts from YouTube videos. IMPORTANT: - When given a YouTube URL, use your tools to extract the English transcript - Return ONLY the raw transcript text - DO NOT write blog posts - DO NOT format the transcript into articles - DO NOT add any additional content or commentary - Just extract and return the transcript as-is, model: openai(gpt-4o-mini), tools: youtubeTools, memory, });各字段的作用文档原文如下nameSupervisor 或 API 调用方引用该 Agent 的标识instructions通过强约束迫使 Agent 只返回原始字幕文本、不做任何加工这是保证下游BlogWriter输入纯净的关键model使用gpt-4o-mini让转录调用快速且廉价示例中的模型标识在仓库源码里写作字符串形式openai/gpt-4o-mini由ai包解析tools包含此前通过 MCP 发现的转录函数memory把 Agent 连接到共享工作记忆重试时可以复用之前的上下文。BlogWriter 子 Agent把字幕变成结构化 MarkdownBlogWriter把字幕转换为带章节的 Markdown 文章文档代码const blogWriterAgent new Agent({ name: BlogWriter, instructions: You are an expert blog writer. When given a YouTube transcript, convert it into a well-structured, engaging blog post with: - A catchy, SEO-friendly title - An engaging introduction - Clear sections with subheadings - Key points and takeaways - A compelling conclusion Format the output in Markdown., model: openai(gpt-4o-mini), memory, });要点instructions描述了最终响应中期望的 Markdown 排版标题、引言、小节、要点、结论共享的memory实例让字幕在无需重新抓取的情况下依然可用因为 VoltAgent 封装了 provider 逻辑你可以换成 AI SDK 支持的任意其他 LLM无需改动调用方代码。Coordinator Supervisor用指令与配置强制编排顺序Supervisor 的职责是强制执行交接顺序并委托工作文档代码同样与仓库源码一致const coordinatorAgent new Agent({ name: YouTubeToBlogCoordinator, instructions: You are a coordinator that orchestrates the process of converting YouTube videos to blog posts. You DO NOT write the blog post yourself - that is the BlogWriters job. IMPORTANT: You MUST follow these steps in EXACT ORDER: STEP 1: Get the Transcript - Delegate to the TranscriptFetcher agent with the YouTube URL - WAIT for the TranscriptFetcher to complete and return the full transcript - DO NOT proceed to Step 2 until you have the complete transcript STEP 2: Generate the Blog Post - After you have the COMPLETE transcript, delegate to the BlogWriter agent - Pass the ENTIRE transcript to the BlogWriter - DO NOT write the blog post yourself - let the BlogWriter do it - WAIT for the BlogWriter to return the complete blog post STEP 3: Return ONLY the Blog Post - Return ONLY the blog post content that the BlogWriter created - DO NOT add any additional commentary, explanations, or meta-information - Just return the blog post as-is CRITICAL RULES: - Complete Step 1 entirely before starting Step 2 - You are ONLY a coordinator - BlogWriter creates the blog post, NOT you - Your final response should be ONLY the blog post content from BlogWriter, model: openai(gpt-4o-mini), memory, subAgents: [transcriptFetcherAgent, blogWriterAgent], supervisorConfig: { fullStreamEventForwarding: { types: [tool-call, tool-result], }, }, });三个关键点subAgents注册转录与写作两个子 Agent。Supervisor 通过内置的delegate_task工具调用它们——这正是 VoltAgent 子 Agent 机制的运行入口。从 packages/core/src/agent/subagent/index.ts 源码可以看到SubAgentManager负责管理父 Agent 可委托任务的子 Agent 配置并把委托结果作为结构化流事件回传supervisorConfig.fullStreamEventForwarding把tool-call、tool-result等工具事件转发给调用方VoltOps 会将这些事件存储下来用于可观测性分析共享memory实例Supervisor 把字幕交给 Writer 时无需在 prompt 中重复粘贴全文直接从工作记忆传递。instructions中反复强调的 WAIT / DO NOT proceed / Return ONLY 并非装饰——由于delegate_task是异步工具调用明确要求等 Step 1 完整返回后再进入 Step 2能显著降低模型跳步或并行乱序的风险。共享记忆与可观测性LibSQL 双适配器示例复用了 LibSQL 适配器来承载工作记忆与可观测性存储文档代码const memory new Memory({ storage: new LibSQLMemoryAdapter(), }); const observability new VoltAgentObservability({ storage: new LibSQLObservabilityAdapter(), });LibSQLMemoryAdapter把每段会话限制在 100 条消息以内memory cap既可以指向本地 SQLite也可以指向远程 Turso 实例。源码层面packages/libsql/src/memory-v2-adapter.ts 支持两种连接模式默认file:./.voltagent/memory.db的本地文件数据库自动建目录以及libsql://...形式的远程 Turso 连接可配合authToken认证它还支持debug开关与自定义logger。换句话说只要在环境变量里提供LIBSQL_DATABASE_URL/LIBSQL_AUTH_TOKEN即可无缝切换到远程托管数据库VoltAgentObservability捕获 spans、日志与工具事件VoltOps 在 Web 控制台把这些数据渲染成可视化时间线。示例把观测数据也落到 LibSQL 存储中实现记忆与观测同库的轻量部署。VoltAgent 服务器配置用 Hono 暴露 HTTP 接口最后把三个 Agent 注册到同一个 VoltAgent 实例并挂上 Hono 服务器文档代码new VoltAgent({ agents: { coordinatorAgent, transcriptFetcherAgent, blogWriterAgent, }, server: honoServer(), logger, observability, });这段配置的含义注册全部三个 Agent可以单独调用任一 Agent也可以通过 Supervisor 走完整流水线Hono HTTP 接口服务器监听http://localhost:3141来自voltagent/server-hono的honoServer()负责把 Agent 会话暴露为可对话的 HTTP 端点挂载observability轨迹数据无需额外接线即可持久化。注意observability在文档的这段服务器配置里以变量形式传入而在仓库源码 examples/with-youtube-to-blog/src/index.ts 中它被内联构造为observability: new VoltAgentObservability({ storage: new LibSQLObservabilityAdapter(), }),两种写法效果相同。logger则来自createPinoLogger({ name: youtube-to-blog, level: info })为整个运行时提供结构化日志。运行 Agent观察三步委托链部署完成后Agent 可以直接处理自然语言请求。文档给出了一个可直接使用的 prompt 示例Extract the transcript of this video: https://www.youtube.com/watch?vU6s2pdxebSo and write a blog post in English.执行时可以在 VoltOps 中观察 Coordinator 分三步委托工作TranscriptFetcher调用 MCP 工具获取英文字幕BlogWriter收到字幕并格式化为结构化 Markdown 文章Supervisor 原样返回 Markdown 输出不加任何额外评论。VoltOps 会捕获每一次委托、工具调用与 LLM 响应因此可以逐步回放整条调用链快速定位是哪一步字幕抓取失败、工具限流、还是写作格式偏差导致结果不符合预期。从源码结构看supervisorConfig.fullStreamEventForwarding.types中列出的tool-call/tool-result事件正是这条链路被完整记录的前提。后续演进方向文档在末尾给出了该示例的五个进阶方向也是把演示示例升级为生产管线的自然路径接入更多 MCP 提供方例如在把字幕交给 Writer 之前增加关键词研究或 SEO 评分工具增加护栏guardrailAgent在发布前对统计数据做事实核查、或识别敏感话题持久化成稿到 CMS通过 webhook 或平台专属 API 把完成的文章推送到内容管理系统写作风格分支让 Coordinator 根据用户偏好选择技术深潜、社媒摘要或高管摘要等不同写作风格引入人工审核human-in-the-loop利用 VoltAgent 的工作流workflow与 VoltOps 时间线 UI 增加人工复核环节。这些方向都可以在本示例的三 Agent 骨架上增量实现无需推翻既有架构。小结with-youtube-to-blog是理解 VoltAgent 多 Agent 编排的最小而完整的范例MCPConfiguration负责外部工具接入packages/core/src/mcp/registry/index.tsAgent的subAgents与supervisorConfig负责层次化委托与事件转发packages/core/src/agent/subagent/index.tsMemory LibSQL 适配器负责跨 Agent 上下文传递packages/libsql/src/memory-v2-adapter.tsVoltAgenthonoServer()负责对外服务化。想进一步扩展可以对照本仓库中with-subagents、with-working-memory、with-mcp等其他示例理解不同编排粒度的取舍。赞分享人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆【免费下载链接】voltagentAI Agent Engineering Platform built on an Open Source TypeScript AI Agent Framework项目地址https://gitcode.com/gh_mirrors/vo/voltagent点击查看免费下载相关推荐VoltAgent × Next.js 实战构建带 Supervisor 子代理编排与持久化记忆的全栈 AI 应用VoltAgent × Next.js 实战构建带 Supervisor 子代理编排与持久化记忆的全栈 AI 应用 本文基于仓库 examples/with人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆Agent 工作流AI 评测MCP 服务MCP Clients语音VoltAgent YouTube-to-Blog 实战MCP 工具 协调器/子代理架构把视频转成 Markdown 博客VoltAgent YouTube to Blog 实战MCP 工具 协调器/子代理架构把视频转成 Markdown 博客 本文围绕 VoltAgent人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆Agent 工作流AI 评测MCP 服务MCP Clients语音VoltAgent 托管记忆实战使用 voltagent/voltagent-memory 接入 VoltOps 托管记忆与向量存储VoltAgent 托管记忆实战使用 voltagent/voltagent memory 接入 VoltOps 托管记忆与向量存储 导读 voltage人工智能AI AgentAgent 框架后端多智能体RAG工具调用Agent 记忆Agent 工作流AI 评测MCP 服务MCP Clients语音上一篇Logger核心架构解析适配器、策略与格式化模式下一篇【亲测免费】 Golint 项目下载及安装教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站