新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/1 1:54:29来源:尧图网络
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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

从被叫渣男到深情祖师爷:童锦程.skill背后的人物真相、争议与时间线 2026/10/1 17:25:27

从被叫渣男到深情祖师爷:童锦程.skill背后的人物真相、争议与时间线

从被叫渣男到深情祖师爷:童锦程.skill背后的人物真相、争议与时间线 【免费下载链接】tong-jincheng-skill 童锦程视角 Skill — 用深情祖师爷的思维框架分析人际关系 项目地址: https://gitcode.com/gh_mirrors/to/tong-jincheng-skill 童锦程.skill 把被称…

阅读更多 →
塞斯·卡拉曼特殊情况投资:用催化剂驱动价值回归 2026/10/1 17:25:27

塞斯·卡拉曼特殊情况投资:用催化剂驱动价值回归

做投资这行十来年,塞斯卡拉曼的《安全边际》是我反复读得最多的一本书。很多人一提到卡拉曼,第一反应是“便宜买好公司”,这个印象不算错,却容易忽略他身上另一个更鲜明的标签——特殊情况投资。他掌舵的Baupost Group不只是买那些…

阅读更多 →
策略需求文档怎么写?五段式框架与需求详述、监控指标落地指南 2026/10/1 17:25:20

策略需求文档怎么写?五段式框架与需求详述、监控指标落地指南

简介:面向策略产品经理的《策略产品经理基础知识:2.3 策略需求文档》是一份精炼的文档资料,系统讲解策略需求文档的编写框架与要点,可帮助读者快速理解策略需求文档怎么写、写什么。文档以项目背景、项目目标、需求概述、需求详述…

阅读更多 →
Node.js与Vue构建畅销图书商城推荐系统全栈实践 2026/10/1 17:25:20

Node.js与Vue构建畅销图书商城推荐系统全栈实践

1. 项目缘起:图书商城为什么需要一套"畅销推荐"这两年做电商类管理系统,听到最多的需求就是"用户进来不知道怎么逛"。尤其是图书商城,SKU动辄几十万,用户搜一本《活着》能翻到同名作品七八个版本,…

阅读更多 →
从失效模式到企业资产:FMEA系统建设实战指南 2026/10/1 17:25:20

从失效模式到企业资产:FMEA系统建设实战指南

前阵子和一个做汽车零部件质量的朋友聊天,他说了句大实话:“我们公司FMEA做了一百多页,客户审核时漂亮得很,可内部没人翻。上次产线上出了问题,大家第一反应是查图纸、翻8D报告,没一个人想起去FMEA里找找。…

阅读更多 →
PHP 8.2 接口数据格式异常怎么排查 2026/10/1 17:25:13

PHP 8.2 接口数据格式异常怎么排查

前言后端日志里一片正常&#xff0c;前端却在控制台里喊&#xff1a;"SyntaxError: Unexpected token <, "<br />" is not valid JSON"。这是"接口数据格式异常"最典型的症状——PHP 没报错&#xff0c;前端却解析不了。之所以会这样&a…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉