BiGuan/Agent
0
1"""2tools/youtube_transcript.py —— 工具⑦:抓取 YouTube 视频字幕3 4有的题目给一个 YouTube 视频链接,问"视频里某人说了什么/出现了什么数字"。5这个工具不去真的"看"视频(那太慢),而是直接抓取视频自带的字幕文字,6把整段台词拼成一段文字交给大模型,从中找答案。7"""8 9import re10 11from langchain_core.tools import tool12 13 14@tool15def youtube_transcript(url: str) -> str:16 """Return the spoken transcript of a YouTube video given its URL (or video id). Use it17 to answer questions about what is said in a video."""18 # 每个 YouTube 视频都有一个 11 位的唯一编号(video id)。下面用正则从各种格式的链接里把它揪出来:19 # 比如 youtube.com/watch?v=XXXX、youtu.be/XXXX、/shorts/XXXX 等都能匹配。20 match = re.search(r"(?:v=|youtu\.be/|/shorts/|/embed/)([0-9A-Za-z_-]{11})", url)21 # 匹配到就用匹配出的编号;没匹配到就假设传进来的本身就是编号。22 video_id = match.group(1) if match else url.strip()23 try:24 from youtube_transcript_api import YouTubeTranscriptApi25 26 # 这个库新旧版本用法不同,下面两种写法是为了兼容:哪种可用就用哪种。27 if hasattr(YouTubeTranscriptApi, "get_transcript"):28 # 旧版用法:返回一串"片段",每段是 {"text": 这句话, ...},把所有句子拼起来。29 chunks = YouTubeTranscriptApi.get_transcript(video_id)30 return " ".join(c["text"] for c in chunks)31 # 新版用法:写法略有不同,但同样是把每段台词拼成整段文字。32 fetched = YouTubeTranscriptApi().fetch(video_id)33 return " ".join(snippet.text for snippet in fetched)34 except Exception as e:35 # 抓不到字幕(比如视频没字幕、或服务器 IP 被限制)就返回错误说明。36 return f"Could not fetch transcript for '{url}': {e}"37 