SurfSense Google Maps 子代理深度解析:多智能体架构下的实时本地数据研究规范 SurfSense Google Maps 子代理深度解析多智能体架构下的实时本地数据研究规范【免费下载链接】SurfSenseOpen-source NotebookLM alternative. Research the open web with live data(Reddit, YT, IG, TikTok, Indeed, Google Search, Maps etc) through one platform, API or MCP server. Join our Discord: https://discord.gg/ejRNvftDp9项目地址: https://gitcode.com/GitHub_Trending/su/SurfSense导读本文围绕 SurfSense 开源项目中google_maps子代理sub-agent的完整系统提示词设计展开说明在监督式多智能体supervisor-agent架构中一个专职研究 Google Maps 实时数据的子代理如何被委派任务、调用抓取工具、执行严格排除规则并以结构化 JSON 回传给主代理。读完本文你将掌握该子代理的工具调用契约、输入输出 Schema 的实际参数含默认值与取值范围、失败处理策略以及如何将其行为规范复用到你自己设计的子代理提示词中。一、定位多智能体聊天中的 Google Maps 专职研究员SurfSense 是一个开源 NotebookLM 替代方案其核心能力之一是通过多智能体系统研究开放网络中的实时数据。在 multi_agent_chat 目录下所有内置子代理builtins按领域划分google_maps就是其中一个专职子代理与 amazon、google_search、indeed、instagram、reddit、tiktok、walmart、web_crawler、youtube 等并列见 subagents/builtins。其系统提示词的第一句话即明确了角色You are the SurfSense Google Maps sub-agent. You receive delegated instructions from a supervisor agent and return structured results for supervisor synthesis.也就是说它不直接面向最终用户而是接收监督代理supervisor agent委派的具体问题把从 Google Maps 实时抓取的结构化结果回传给监督代理做综合synthesis。这种监督者 领域专家的分层设计是把网页检索、YouTube、本地商户数据等不同来源解耦的关键。从源码角度看该子代理的装配逻辑位于 agent.pybuild_subagent()通过read_md_file(__package__, system_prompt)读取本目录下的system_prompt.md把描述description、系统提示词、工具列表与权限规则集ruleset打包成SurfSenseSubagentSpec。也就是说本文讲解的这份system_prompt.mdsurfsense_backend/app/agents/chat/multi_agent_chat/subagents/builtins/google_maps/system_prompt.md正是该子代理运行时实际注入模型的行为规范。子代理的触发描述description.md进一步明确了它的适用场景与边界触发find business type near/in X、get details for this place、查询某商户的电话/地址/营业时间/评分、how many reviews、获取某商户评论、what are people saying about this business以及与本聊天中早前 Maps 结果做对比。不负责普通网页交给 web crawling 子代理YouTube 交给 YouTube 子代理。二、可用工具清单三个动词 两个免费读取器系统提示词的available_tools段落声明了该子代理的完整工具面工具用途google_maps_scrape按搜索词、URL 或 place ID 抓取 Google Maps 商户数据google_maps_reviews抓取指定商户的评论/口碑数据read_run/search_run免费读取器对已存储的抓取结果分页浏览或按模式检索工具的实际绑定逻辑在 tools/index.py 中load_tools()通过build_capability_tools()把GOOGLE_MAPS_SCRAPE与GOOGLE_MAPS_REVIEWS两个能力动词capability verbs实例化为可调用的工具规则集RULESET的 origin 即为google_maps。2.1 google_maps_scrape商户与详情抓取该能力注册于 scrape/definition.py官方描述为 Scrape public Google Maps places, details, reviews, and photos. Use search_queries, urls, or place IDs.。它是一个**双计量dual-metered**能力按商户数GOOGLE_MAPS_MICROS_PER_PLACE与附加评论数GOOGLE_MAPS_MICROS_PER_REVIEW分别计费。输入 Schema 定义在 scrape/schemas.py参数如下参数类型/默认值说明search_querieslist[str]最多 20 项Maps 搜索词如 coffee shops、dentist每个搜索词最多返回max_places条结果urlslist[HttpUrlStr]最多 20 项商户详情页/maps/place/...或搜索结果页 URLplace_idslist[str]最多 20 项已知的 Google Place ID形如ChIJ...locationstr \| None限定搜索范围的地理位置如 New York, USAmax_placesint 10范围 1–1000每个搜索词最多返回的商户数languagestr en结果语言代码如 en、frinclude_detailsbool False是否额外抓取每个商户的详情页营业时间、高峰时段、扩展联系信息更慢、请求更多max_reviewsint 0范围 0–100000每个商户附加的评论数0 不附加max_imagesint 0范围 0 起每个商户附加的图片数0 不附加注意三个来源字段存在互斥校验模型校验器_require_a_source强制要求search_queries、urls、place_ids至少提供其一否则抛错。这与系统提示词failure_policy中无可用搜索词/URL/Place ID 即返回statusblocked的约定一一对应。ScrapeInput还提供了两个成本估算属性estimated_units最坏情况计费商户数 搜索词数 ×max_places URL 数 Place ID 数与estimated_review_units供预检计费闸门pre-flight gate使用。输出ScrapeOutput直接复用底层抓取器的PlaceItem来自app/proprietary/platforms/google_mapsbillable_units按实际返回的商户数计算attached_review_count统计内联附加的评论数。2.2 google_maps_reviews评论与口碑抓取注册于 reviews/definition.py描述为 Fetch public Google Maps reviews with authors, ratings, text, and owner responses. Use urls or place IDs.按评论条数计费GOOGLE_MAPS_MICROS_PER_REVIEW。输入 Schema 见 reviews/schemas.py参数类型/默认值说明urlslist[HttpUrlStr]最多 20 项要抓取评论的商户 URL与place_ids至少提供其一place_idslist[str]最多 20 项已知 Google Place IDChIJ...max_reviewsint 20范围 1–100000每个商户最多返回的评论数sort_by枚举默认newest排序方式newest/mostRelevant/highestRanking/lowestRankinglanguagestr en评论语言代码start_datestr \| None只返回该 ISO 日期如2024-01-01当天及之后的评论ReviewsOutput复用底层抓取器的ReviewItem评论作者、正文、星级、商家回复、日期等billable_units即返回的评论条数。2.3 read_run / search_run存储化结果的分页读取这是提示词强调的免费读取器。共享片段 run_reader.md 定义了其用法当某个工具的大结果被完整存储、只以预览形式展示并附run_uuid引用时不要重跑工具去看更多用read_run(ref, offset, limit)分页读取存储结果每行是一个 JSON 结果项或用search_run(ref, pattern)按模式检索若单个结果项本身过大可用char_offset在该行内部继续翻页截断提示会给出下一个值。这一设计避免了多智能体系统中重抓取换上下文的浪费也是输出契约中能从自己工具完成的分页/检索必须立即执行而不是返回 partial这条规则的底层支撑。三、playbook任务如何被翻译成工具调用系统提示词的playbook段落是该子代理的操作手册逐条拆解如下按主题找商户调用google_maps_scrape传入search_queries并用location限定范围。提示词给出的示例是 coffee shops in Austin, USA——这与 Schema 中search_querieslocation的设计完全吻合。已知链接或 ID直接传urls或place_ids跳过搜索步骤。需要更详细信息营业时间、高峰时段、扩展联系信息设置include_detailstrue。注意该参数默认关闭因为它slower; more requests。评论/口碑对指定商户调用google_maps_reviews同样支持urls或place_ids。批量调用把多个查询词、URL、Place ID 合并到一次调用中而不是拆成多次单条调用——这正是 Schema 中每个来源字段max_length20的设计意图MAX_MAPS_SOURCES 20是对一次同步请求 fan-out 的上限约束。排除标准是严格的当任务排除某类目或某品牌时凡是名称、网站域名或类目匹配的商户一律剔除——即使某连锁的分支/卫星店也仍是该连锁不得重新解释为可接受。腾出的名额用更多/更宽的查询填补。网站域名是归属信号若某商户的网站挂在父组织域名下政府门户、连锁站点、医疗系统或加盟商域名而非自有域名则该商户归属于该父组织——包含/排除判断要针对父组织执行共享同一父域名的多个地点视为同一组织。对比请求引用run_reader片段拉取当前值与本次会话中早前工具结果对比报告具体增量新增、移除、旧值 → 新值。3.1 严格排除规则的工程含义排除即严格这条规则值得展开在多智能体研究中最常见的错误是子代理为了完成任务而把被排除对象的变体当作新发现。提示词明确禁止这种重新解释never reinterpret it as acceptable并要求用更宽的查询补位而不是降低标准。而域名即归属规则为归属判定提供了可操作的证据标准——不是靠模型猜测而是看网站域名层级。这两条共同保证了回传给监督代理的证据具有一致的、可审计的包含/排除标准。四、工具策略与安全边界tool_policy与safety、out_of_scope三个段落共同界定了该子代理的行为红线只用available_tools内的工具——不得擅自调用其他子代理或非 Maps 工具status非success的项视为无数据——报告为不可用绝不凭空捏造只报告证据中可指出的增量——绝不编造事实、数量、引文、评分或 URL不生成交付物、不做 connector 变更——只返回发现由监督代理决定后续行动非 Maps 网页归 web 抓取子代理YouTube 归 YouTube 子代理——严格保持领域边界证据不完整或冲突时明确报告不确定性绝不把未经证实的主张当作事实。这些约束直接呼应了子代理描述中 Not for general web pages (use the web crawling specialist) or YouTube (use the YouTube specialist) 的边界说明也体现了 SurfSense 对研究型 Agent 不能编造来源这一底线的工程化落实。五、失败处理策略三种明确的失败路径failure_policy定义了无歧义的三类失败及对应返回场景返回请求不明确——没有可用的搜索词、URL 或 Place IDstatusblocked并在missing_fields中列出缺失字段工具失败statuserror附一个简洁的恢复建议next_step没有有效证据statusblocked附更窄的查询词或仍需的 URL/ID注意其核心原则失败不是终点而是带着下一步建议的交接。statusblocked并不等于放弃而是把问题重新规约为监督代理可以重新派发的、更精确的任务。六、输出契约单一 JSON 对象系统提示词output_contract要求该子代理只返回一个 JSON 对象不允许 markdown 或散文字段结构如下{ status: success | partial | blocked | error, action_summary: string, evidence: { findings: [string], sources: [string], confidence: high | medium | low }, next_step: string | null, missing_fields: [string] | null, assumptions: [string] | null }在此基础上提示词通过include snippetoutput_contract_base/引入了所有子代理共用的通用契约规则见 output_contract_base.mdstatussuccess→next_step与missing_fields必须为nullstatuspartial|blocked|error→next_step必须非空next_step只用于你自身无法完成的动作如果该步骤是对自己工具的调用用read_run/search_run分页、调整参数重跑应立即执行并报告改进后的结果而不是返回partialstatusblocked且因缺少必要输入 →missing_fields必须非空assumptions记录对用户意图的推断无需推断时为nullevidence字段以各路由专属契约为准绝不发明工具未返回的字段当某条发现来自一次抓取运行且工具结果声明 Cite this scraper run as [n] 时必须把该[n]标注原样附加到发现文本上保证引用能存活到最终答案中。6.1 路由专属细则在通用契约之上Google Maps 子代理还有两条路由专属限制evidence.findings最多 10 条每条必须是一句话、陈述一个独立事实或增量不得粘贴原始载荷evidence.sources最多 10 个 URL一条发现对应一个 URL 时列出每个 URL 只列一次。这两个上限是典型的防注水设计强制子代理把抓回来的原始数据蒸馏成监督代理可直接综合的高密度发现而不是把大段 JSON 丢回给监督者。七、设计启示如何复用这套子代理规范从本文的源码证据可以看出SurfSense 的 Google Maps 子代理把行为规范与实现清晰分层规范即提示词文件system_prompt.md是纯 Markdown 的行为契约通过read_md_file加载agent.py无需改动 Python 代码即可迭代 Agent 行为共享片段复用run_reader、output_contract_base等以 snippet 形式被多个子代理include保证输出契约跨子代理一致见 shared/snippets输入 Schema 即工具面提示词中的每个动作搜索/详情/评论/批量都有对应的 pydantic Schema 字段与校验器兜底模型幻觉空间被压缩到最小计费与预算透明estimated_units、estimated_review_units、billable_units等属性让每次调用前可预估、调用后可核算成本适合作为多智能体研究的资源控制层。如果你正在为自己的 Agent 设计类似的研究型子代理这套角色声明 → 工具清单 → 操作手册 → 红线策略 → 失败策略 → 结构化输出契约的提示词骨架加上存储化结果 免费读取器的上下文管理方式是一个经过生产级设计检验的参考模板。若需查阅完整上下文可继续阅读 系统提示词、工具装配、抓取 Schema 与 评论 Schema。【免费下载链接】SurfSenseOpen-source NotebookLM alternative. Research the open web with live data(Reddit, YT, IG, TikTok, Indeed, Google Search, Maps etc) through one platform, API or MCP server. Join our Discord: https://discord.gg/ejRNvftDp9项目地址: https://gitcode.com/GitHub_Trending/su/SurfSense创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考