byted-viking-aisearch-feishu
Viking AISearch Feishu Skill
你是一个专注于飞书「云文档 / 电子表格 / 多维表格 / 知识库(Wiki)」的搜索与内容读取助手。你必须严格只读,不实现任何写操作。
🎯 核心功能
- 搜索:聚合搜索云文档(doc/docx)、电子表格(sheet)、多维表格(bitable)、知识库空间与节点(wiki)
- 读取:读取 doc/docx 原文;读取 sheet 预览区间数据;读取 bitable 表结构与记录样本;读取 wiki 节点(自动跳转到关联对象内容)与 wiki 空间子节点列表
🚦 场景路由
| 用户意图示例 | 匹配场景 | 主要方法 | 产出 |
|---|---|---|---|
| “搜一下飞书里关于‘Q4’的资料” | 聚合搜索 | search_items() / search_docs() |
返回条目列表(title/type/token/url/source…) |
| “读取这个 docx / sheet / base 的内容” | 内容读取 | fetch_raw_content() |
返回 content(纯文本/TSV/JSON 摘要) |
| “列出我有权限的知识库空间” | 知识库空间 | list_wiki_spaces() / search_wiki_spaces() |
返回空间列表 |
| “列出某个知识库空间的子节点” | 空间子节点 | list_wiki_space_nodes() |
返回节点列表 |
📚 主要接口使用方法
1) 初始化
from scripts.feishu_search import FeishuDocSearch
# 方式一:使用环境变量(推荐)
# export LARK_USER_ACCESS_TOKEN="u-xxxxxxxxxxxxxxxxxxxxxxxx"
tool = FeishuDocSearch()
# 方式二:显式传入 access_token
tool = FeishuDocSearch(access_token="u-xxx")
2) 聚合搜索 - search_items()
功能:按关键词搜索云文档/电子表格/多维表格,并可选聚合知识库节点与知识库空间
参数:
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
search_key |
str |
是 | - | 搜索关键词 |
count |
int |
否 | 10 |
返回数量(分页后) |
offset |
int |
否 | 0 |
偏移量(分页后) |
types |
List[str] |
否 | ["doc","docx","sheet","bitable","wiki","wiki_space"] |
搜索类型集合 |
owner_ids |
List[str] |
否 | None |
所有者 Open ID 过滤(仅 suite docs 搜索) |
chat_ids |
List[str] |
否 | None |
群聊 ID 过滤(仅 suite docs 搜索) |
space_id |
str |
否 | None |
仅搜索该知识库空间内节点(wiki 节点搜索) |
返回语义:
- 只要至少一条搜索路径返回可用结果,
search_items()仍可返回success=true - 若某一路径失败或降级,结果会在
data.warnings中显式暴露,不再静默吞掉 - 常见 warning 键包括:
suite_error、suite_fallback_error、wiki_nodes_error、wiki_spaces_error、wiki_spaces_warning
典型部分成功返回:
{
"success": true,
"message": "搜索成功",
"data": {
"total": 3,
"has_more": false,
"items": [],
"warnings": {
"suite_error": {
"message": "文档套件搜索失败",
"error": {}
}
}
}
}
3) 兼容接口 - search_docs()
search_docs() 为历史兼容接口,内部基于 search_items() 实现,默认包含 doc/docx/sheet/bitable/wiki。
使用示例:
# 基础搜索
result = tool.search_docs(search_key="项目计划")
# 指定类型搜索
result = tool.search_docs(
search_key="季度报告",
docs_types=["doc", "docx", "sheet", "bitable", "wiki"]
)
# 分页搜索
result = tool.search_docs(
search_key="技术方案",
count=20,
offset=0
)
返回示例:
{
"success": true,
"message": "搜索成功",
"data": {
"total": 12,
"has_more": false,
"warnings": {
"wiki_error": {
"message": "权限不足,请为应用开通 wiki 搜索相关权限",
"error": {
"type": "permission_denied",
"detail": "HTTP 403: ..."
}
}
},
"items": [
{
"docs_token": "your_docs_token_xxx",
"docs_type": "docx",
"owner_id": "ou_xxx",
"title": "项目计划.docx",
"url": "https://xxx.feishu.com/docx/xxx",
"source": "suite_docs"
},
{
"docs_token": "your_docs_token_xxx",
"docs_type": "wiki",
"title": "用户操作手册",
"url": "https://xxx.feishu.com/wiki/xxx",
"space_id": "your_space_id_xxx",
"obj_type": "docx",
"obj_token": "your_obj_token_xxx",
"source": "wiki_nodes"
}
]
}
}
3.5) 搜索 wiki 节点 - search_wiki_nodes()
功能:按 wiki 节点标题/内容搜索知识库文档
参数:
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
keyword |
str |
是 | - | 搜索关键词 |
count |
int |
否 | None |
返回数量 |
offset |
int |
否 | None |
偏移量 |
space_id |
str |
否 | None |
指定 wiki 知识空间 |
使用示例:
result = tool.search_wiki_nodes(
keyword="用户操作手册",
space_id="your_space_id_xxx"
)
返回示例:
{
"success": true,
"message": "搜索成功",
"data": {
"total": 1,
"has_more": false,
"items": [
{
"docs_token": "your_docs_token_xxx",
"docs_type": "wiki",
"title": "用户操作手册",
"url": "https://xxx.feishu.com/wiki/xxx",
"space_id": "your_space_id_xxx",
"obj_type": "docx",
"obj_token": "your_obj_token_xxx",
"source": "wiki_nodes"
}
]
}
}
4) 内容读取 - fetch_raw_content()
支持的 docs_type:
doc/docx:读取原文(raw_content)sheet:读取表格预览区间数据(默认首个工作表A1:Z100,可传range_a1/max_rows/max_cols)bitable:读取多维表格的数据表列表,并读取一个数据表的记录样本(可传table_id/page_size/page_token)wiki:读取知识库节点;若节点关联对象为 doc/docx/sheet/bitable,会自动读取关联对象内容wiki_space:读取知识库空间的子节点列表(可分页)
补充说明:
search_wiki_spaces()命中分页上限时,会返回data.has_more=true,并在data.warnings.pagination_truncated中说明结果可能不完整fetch_sheet_content()在 metainfo 端点失败但 query 端点成功时,仍返回success=true,并在data.warnings.metainfo_error中保留降级信息fetch_bitable_content()在“表列表获取成功但记录样本读取失败”时,返回success=true和message=部分成功:已获取数据表列表,但记录样本读取失败,同时在data.warnings.records_error中暴露失败详情
使用示例:
# 读取 docx
result = tool.fetch_raw_content(
docs_type="docx",
docs_token="your_docs_token_xxx"
)
# 读取 sheet(可指定范围)
sheet_result = tool.fetch_raw_content(
docs_type="sheet",
docs_token="your_sheet_token_xxx",
range_a1="Sheet1!A1:D50"
)
# 读取 bitable(可指定表与分页)
base_result = tool.fetch_raw_content(
docs_type="bitable",
docs_token="your_app_token_xxx",
table_id="tbl_xxx",
page_size=50
)
返回示例(docx):
{
"success": true,
"message": "获取成功",
"data": {
"content": "Q4项目计划\n一、项目背景..."
}
}
🔑 鉴权
- 使用
Authorization: Bearer <LARK_USER_ACCESS_TOKEN>(用户访问令牌) - 访问令牌通过
viking_feishu_oauth_provider注入到环境变量LARK_USER_ACCESS_TOKEN,实现动态获取
📝 使用流程建议
典型流程:搜索并读取内容
# 1. 搜索
search_result = tool.search_docs(search_key="项目计划")
if not search_result.get("success"):
print(search_result.get("message"))
raise SystemExit
items = search_result.get("data", {}).get("items", [])
if not items:
print("未找到相关文档")
raise SystemExit
# 2. 获取第一个文档的 token 和类型
first_item = items[0]
docs_token = first_item["docs_token"]
docs_type = first_item["docs_type"]
# 3. 读取内容
content_result = tool.fetch_raw_content(docs_type=docs_type, docs_token=docs_token)
print(content_result)
📋 文档类型枚举
| docs_type | 说明 |
|---|---|
doc |
旧版飞书文档 |
docx |
新版飞书文档 |
sheet |
电子表格 |
bitable |
多维表格 |
wiki |
飞书 wiki 节点(可自动读取关联对象内容) |
wiki_space |
知识库空间(可读取子节点列表) |
获取 wiki 节点信息 - get_wiki_node()
功能:获取 wiki 节点的详细信息,包括标题、关联对象类型等
使用示例:
result = tool.get_wiki_node(node_token="your_node_token_xxx")
返回示例:
{
"success": true,
"message": "获取成功",
"data": {
"node_token": "your_node_token_xxx",
"title": "文档标题",
"obj_type": "docx",
"obj_token": "your_obj_token_xxx",
"node_type": "origin",
"space_id": "your_space_id_xxx",
"creator": "ou_xxx",
"owner": "ou_xxx"
}
}
🚨 错误处理
| 错误类型 | 识别方式 | 返回提示 |
|---|---|---|
| 认证失败 | 401/Unauthorized |
"认证失败,请检查 access_token 是否有效或已过期" |
| 权限不足 | 403/Forbidden |
"权限不足,请为应用开通搜索相关权限" |
| 请求超时 | 包含 timeout |
"请求超时,请稍后重试" |
| 搜索参数错误 | search_key 为空 |
"search_key 不能为空" |
| 不支持的文档类型 | 未知的 docs_type |
"不支持的 docs_type,仅支持 doc/docx/sheet/bitable/wiki/wiki_space" |
More from bytedance/agentkit-samples
byted-las-video-edit
Extracts and clips video segments from long videos using natural language descriptions. AI-powered smart video editing, video trimming, and video cutting powered by Volcengine LAS. Describe what you want — scenes, people, objects, actions, events — and get trimmed clips automatically. Video search and video content retrieval: find and locate specific people, objects, or scenes in footage. Supports reference images for person matching and object matching (search video by image). Two modes: simple (fast) and detail (thorough, optional ASR). Use this skill when the user wants to edit/clip/cut videos using natural language descriptions, extract highlights or key moments from videos, find specific people/objects/scenes in video footage (by text or reference image), compile highlight reels from long videos, trim video segments, or do AI-powered smart video editing.
163byted-seedance-video-generate
Generate videos using Seedance models. Invoke when user wants to create videos from text prompts, images, or reference materials.
109byted-data-search
|
106byted-las-vlm-video
Analyzes and understands video content using Volcengine LAS Doubao vision-language models (VLM). Multimodal AI video analysis, video comprehension, and visual understanding of video clips and footage. Performs video question answering (video Q&A) — ask questions about what happens in a video and get AI answers. Scene recognition and scene description, object recognition and object detection, action recognition and action detection from video frames. Generates video descriptions, video captions, video summaries, video annotations, and content summarization. Visual frame analysis for identifying people, objects, actions, and events in video. Auto-compresses video to 50MB before inference. Synchronous single-call processing. Use this skill when the user wants to analyze or understand video content using VLM/AI, do video Q&A (ask questions about a video), describe what happens in a video, recognize objects/actions/scenes in video frames, generate video captions/descriptions/summaries, annotate or label video content, get AI-powered visual understanding of video clips, or perform multimodal video analysis with vision-language models.
97byted-text-to-speech
将文本合成为语音(TTS)。使用火山引擎豆包语音合成 API,支持流式合成、多种音色、语速/音调/音量调节、Markdown 过滤和 LaTeX 公式播报。当用户需要把文字转成语音、生成朗读音频、配音、旁白、播报,或提到「文字转语音」「TTS」「语音合成」「朗读」「配音」时使用本技能。
93byted-marketing-agent-trending-list
当用户想了解行业热点、查话题挑战榜单、看最近有什么热搜事件或公域流行趋势时使用。支持话题挑战和热榜事件两种维度。手动触发:/trending
62