ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Gallery 内置 Skill 实战:query-wikipedia 维基百科摘要查询的调用规范与源码实现

Gallery 内置 Skill 实战:query-wikipedia 维基百科摘要查询的调用规范与源码实现 人工智能大模型本地部署AI 应用移动开发AI AgentAI 技能MCP Clients【免费下载链接】galleryA gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally.项目地址https://gitcode.com/GitHub_Trending/gallery44/gallery点击查看免费下载query-wikipedia 是 Android Gallery 项目内置的一个端侧 Agent Skill它通过run_js工具驱动一段 JavaScript 脚本从指定语言的 Wikipedia 拉取词条的简介summary与信息框infobox帮助端侧大模型在不联网搜索的情况下快速获取某人 / 某事件 / 某作品的权威概述。本文以 SKILL.md 为主线完整讲解其参数规范、调用步骤、回答约束并结合scripts/index.html与 Android 端RunJsTool的源码剖析一条 Agent 调用从指令解析、WebView 执行到结果回传的完整链路。一、Skill 是什么一段可被 Agent 调用的查询工具说明书在 Gallery 的架构中一个 Skill 由两部分组成SKILL.md面向 LLM 的指令文件描述何时调用、传什么参数、如何回答本质是工具说明书scripts/index.html真正执行逻辑的 WebView 页面通过全局入口window[ai_edge_gallery_get_result]接收 JSON 参数并返回结果。query-wikipedia 位于 skills/built-in/query-wikipedia/同时在 Android 应用的 assets 中也有一份镜像副本 Android/src/app/src/main/assets/skills/query-wikipedia/。其 frontmatter 定义如下--- name: query-wikipedia description: Query summary from Wikipedia for a given topic. ---从源码结构看Skill对象的name与description会被 SkillExtensions.kt 中的模板SKILL_INSTRUCTIONS_TEMPLATE拼装进注入给模型的多行指令const val SKILL_INSTRUCTIONS_TEMPLATE ---\nname: %s\ndescription: %s\n---\n\n%s也就是说SKILL.md 的 frontmatter 并不是摆设——load_skill工具在把 Skill 内容交给模型时会完整带上name、description与instructions即本文件正文部分见 LoadSkillTool.kt。query-wikipedia 的存在意义在于端侧模型对事实性、时效性问题的内部知识可能过时或缺失而通过该 Skill 可以实时拿到维基百科的结构化摘要作为可信上下文。二、调用方式run_js工具 data JSON 参数SKILL.md 明确规定Agent 应按如下方式调用Call therun_jstool usingindex.htmland a JSON string fordatawith the following fields.对应到 Android 端run_js是 RunJsTool.kt 中声明的工具其三个参数为参数说明本 Skill 的取值skillName要调用的 Skill 名称query-wikipediascriptName要执行的脚本名index.html未提供时默认data传给脚本的 JSON 字符串{topic: ..., lang: ...}data中必须包含两个字段topic必填与lang必填。topic只提取主体实体Extract ONLY the primary entity, person, or event (e.g., 2026 Oscars, Albert Einstein). You MUST REMOVE all specific question details, action words, or conversational text (e.g., do NOT include words like winner, best picture, who won, history of). Search for the broad subject so the tool can return the main article.即把用户问题中的疑问词、动作词、限定细节全部剥离只留核心词条。例如用户提问topic 取值理由谁赢得了 2026 年奥斯卡最佳影片2026 Oscars去掉 winner / best picture / who won爱因斯坦的出生年份是什么Albert Einstein去掉 history of 等描述性词法国的首都是什么France只保留国家实体设计意图在 index.html 中可以得到印证脚本第一步用的是generator: search的模糊搜索gsrsearch直接拿topic全文去匹配维基标题。搜索词越干净命中的就越是词条主页返回的 extract 质量越高。lang与 topic 保持同语言的 2 字母代码The 2-letter language code. This code MUST match the language of the keywords you provided in thetopicfield.支持的常见代码enEnglish、esSpanish、zhChinese、frFrench、deGermanjaJapanese、koKorean、itItalian、ptPortugueseruRussian、arArabic、hiHindilang直接决定请求的维基域名脚本用模板字符串拼接https://${lang}.wikipedia.org/w/api.php见 index.html所以zh会访问中文维基、de会访问德语维基。若 topic 用了德语关键词却传en模糊搜索基本无法命中正确词条——这就是lang 必须与 topic 语言一致的原因。三、回答约束省上下文、保语言一致、兜底时效SKILL.md 的 Constraints 部分定义了模型拿到结果后的回答规范这是该 Skill 的输出侧协议需要与输入侧参数一同遵守1. 摘要要短且必须句子完整。Provide a concise summary (1-3 complete sentences) to conserve context. Always ensure your response ends with a finished sentence.端侧上下文窗口有限维基正文很长模型应把脚本返回的 extract 压缩成 13 个完整句子不得在半句话处截断。2. 回答语言与用户原问题一致。your response MUST BE written in the SAME language as the users original prompt.注意这里绑定的是用户 prompt 的语言而非lang字段。用户用中文提问即使查询的lang是en回答也要用中文。3. 周期性事件 / 时效性事实必须锁定具体届次。For recurring events or time-sensitive facts, query the specific iteration (e.g., 2026 Oscars). If the user omits the year, default to the current year.例如奥斯卡是年度重复事件topic 应为2026 Oscars若用户没说年份则默认取当前年份。这与维基百科词条按届次独立成页的排版方式对应——只有带上届次才能命中正确的词条主页。4. 找不到答案时先说明再给相关事实。If the exact answer to the users question is not found in the extract, briefly state this, then proactively offer a related piece of information thatwasfound in the text.这是诚实 有用的兜底策略不编造明确告知 extract 中未命中同时把文本中确实存在的邻近信息作为替代价值提供给用户。四、底层实现两段式维基 API 查询管线scripts/index.html 的核心是fetchWikiFuzzyAndInfobox(topic, lang)整条管线分为四个阶段阶段 1模糊搜索 取词条简介extractconst searchParams new URLSearchParams({ action: query, format: json, generator: search, gsrsearch: topic, gsrlimit: 1, prop: extracts, explaintext: 1, exintro: 1, origin: *, });关键参数含义generator: searchgsrsearch: topic以 topic 做模糊搜索gsrlimit: 1只取第一个结果prop: extractsexintro: 1只返回条目的引言段intro这是被判定为最干净的摘要explaintext: 1返回纯文本而非 HTML便于 LLM 直接阅读origin: *允许跨域请求WebView 页面发起 fetch 必需。如果searchData.query.pages为空脚本直接返回错误对象No Wikipedia articles found matching topic in language lang.阶段 2拉取第 0 节 HTML 解析信息框infoboxconst parseParams new URLSearchParams({ action: parse, page: title, section: 0, prop: text, format: json, origin: *, });action: parsesection: 0只取页面顶部含标题、摘要和右侧 infobox的 HTML用DOMParser解析后querySelector(table.infobox)找到信息框表格遍历每一行取th键与td值并用正则replace(/\[\d\]/g, )清除[1]、[2]这类引用角标多行值用 | 连接。这一步是整个 Skill 的价值增量除了段落摘要还拿到出生日期、获奖年份、国籍等结构化键值对这正是回答谁获奖了这类问题的关键证据。阶段 3合并 INFOBOX 与 SUMMARYif (infoboxText) finalResult --- INFOBOX ---\n${infoboxText}\n\n; if (extract) finalResult --- SUMMARY ---\n${extract};最终返回结构为{ title, result }result以--- INFOBOX ---与--- SUMMARY ---两个分区组织方便 LLM 快速定位两类信息。若两者皆空则返回错误Found page title but no text or infobox was available.阶段 4按语言设置安全截断上限switch (lang.toLowerCase()) { case zh: maxChars 1500; break; case fr: maxChars 4300; break; case es: maxChars 4500; break; case en: default: maxChars 5000; break; } if (finalResult.length maxChars) { finalResult finalResult.substring(0, maxChars) \n\n... [TRUNCATED TO SAVE CONTEXT]; }中文单字信息密度高所以截断阈值最低1500 字符英文默认 5000。超限部分追加... [TRUNCATED TO SAVE CONTEXT]标记配合 SKILL.md 中13 句摘要的约束共同把注入模型的 token 量控制在预算内。统一入口ai_edge_gallery_get_resultwindow[ai_edge_gallery_get_result] async (data) { ... }WebView 端通过这个全局函数接收 JSON 字符串缺topic返回No topic provided to search.缺lang返回No language code (lang) provided.任何异常兜底返回Failed to query Wikipedia: message。五、端到端运行链路从指令到结果的五次跳转综合 Android 端源码一次 query-wikipedia 调用在运行时经历如下链路加载 Skill 指令Agent或用户触发load_skill工具SkillsProvider.loadSkill(query-wikipedia)取出 SkillgetSkillContent()按---\nname: ...\ndescription: ...\n---\n\ninstructions模板格式化后注入对话见 LoadSkillTool.kt 与 SkillExtensions.kt解析脚本地址run_js内部调用skill.getJsSkillUrl(index.html)。built-in Skill 的importDirName非空于是拼出$LOCAL_URL_BASE/query-wikipedia/scripts/index.html逻辑见 SkillExtensions.kt发送执行动作CallJsToolAction(url, data, secret)通过ToolExecutionContext.actionChannel发出RunJsTool.kt此时工具会在聊天面板中展示Calling JS script...的进度条目WebView 执行页面加载index.html后以dataJSON 调用ai_edge_gallery_get_result内部完成上文四阶段查询返回{title, result}或{error}结果回传解析run_js用 Moshi 把返回值解析为CallJsSkillResult有error则标记status: failed否则以mapOf(result to ..., status to succeeded)交还给模型RunJsTool.kt。模型随后按 SKILL.md 的约束生成 13 句摘要。需要补充的是若 Skill 声明了requireSecret例如调用需要 API Key 的外部服务run_js会先弹窗向用户索要密钥并写入 DataStore而query-wikipedia 走的是公开的 Wikipedia API不需要任何密钥因此该 Skill 无此环节逻辑见 RunJsTool.kt。六、边界情况与可观测性设计脚本对异常做了多层防护值得在实际开发中复用HTTP 非 2xxif (!searchRes.ok) throw new Error(...)进入外层 catch无匹配词条返回{ error: No Wikipedia articles found... }infobox 解析失败单独try/catch包裹仅console.warn后静默跳过不影响 extract 返回——部分可用优于整体失败结果为空返回{ error: Found page ... but no text or infobox was available. }参数缺失在ai_edge_gallery_get_result入口分别校验topic、lang。同时run_js端也会对返回结果做双重校验若返回的 JSON 既没有result、webview也没有image就把整个原始字符串当作结果返回RunJsTool.kt确保 WebView 端任何未预期的返回格式都不会导致 Agent 死循环或空响应。七、给 Skill 作者与使用者的实践建议综合 SKILL.md 与源码可以提炼出几条可直接落地的经验参数语义即质量topic越纯、越贴近维基词条标题模糊搜索命中率越高。凡是在指令中对 LLM 强调剥离疑问词与动作词的 Skill其搜索类脚本都应采用generator: searchgsrlimit: 1的取首个结果策略语言代码对齐lang决定域名与截断阈值务必与 topic 语言一致对多语言场景可在脚本内用switch维护每语言的字符上限结构化信息优先先用action: parse拉第 0 节 HTML、再正则清洗引用角标比直接要整页正文更省 token 且更利于回答事实型问题诚实的兜底协议SKILL.md 中未命中即说明 给邻近信息的约束配合脚本{ error }返回协议能有效避免端侧模型在事实问题上编造答案。以上规范与实现路径同样适用于本仓库其他基于run_js的 built-in Skill如calculate-hash、text-spinner等参见 skills/built-in/可作为理解 Gallery 端侧技能系统的通用参考。赞分享人工智能大模型本地部署AI 应用移动开发AI AgentAI 技能MCP Clients【免费下载链接】galleryA gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally.项目地址https://gitcode.com/GitHub_Trending/gallery44/gallery点击查看免费下载相关推荐AI Edge Gallery 端侧技能解析基于 run_js 的 query-wikipedia 维基百科查询技能实现原理与实战指南AI Edge Gallery 端侧技能解析基于 run_js 的 query wikipedia 维基百科查询技能实现原理与实战指南 本篇技术指南以 AI人工智能大模型本地部署AI 应用移动开发AI AgentAI 技能MCP ClientsHive Aden Tools 的 Wikipedia 搜索工具实战指南免 API Key 接入维基百科检索与摘要Hive Aden Tools 的 Wikipedia 搜索工具实战指南免 API Key 接入维基百科检索与摘要 导读 本文面向在 Hive 生产级多 Ag人工智能AI Agent多智能体MCP 服务工具调用浏览器控制compromise-wikipedia 插件实战基于 efrt 压缩词库的维基百科实体识别compromise wikipedia 插件实战基于 efrt 压缩词库的维基百科实体识别 导读 本文以 compromise 生态中的实验性插件 compNLP人工智能上一篇零依赖获取用户主目录go-homedir跨平台解决方案全指南下一篇EMQX GET /clients_v2 分页游标修复解析内存会话客户端列表为何不再返回多余 cursor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表