@llmindset/hf-mcp 0.2.19 → 0.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/docs-search/doc-fetch.d.ts +2 -2
- package/dist/docs-search/doc-fetch.d.ts.map +1 -1
- package/dist/docs-search/doc-fetch.js +80 -10
- package/dist/docs-search/doc-fetch.js.map +1 -1
- package/dist/docs-search/doc-fetch.test.js +4 -2
- package/dist/docs-search/doc-fetch.test.js.map +1 -1
- package/dist/hub-inspect.d.ts +2 -2
- package/dist/hub-inspect.js +2 -2
- package/dist/hub-inspect.js.map +1 -1
- package/dist/tool-ids.d.ts +4 -4
- package/dist/tool-ids.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/docs-search/doc-fetch.test.ts +5 -3
- package/src/docs-search/doc-fetch.ts +94 -10
- package/src/hub-inspect.ts +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
export declare const DOC_FETCH_CONFIG: {
|
|
3
3
|
readonly name: "hf_doc_fetch";
|
|
4
|
-
readonly description: "Fetch a document from the Hugging Face documentation library. For large documents, use offset to get subsequent chunks.";
|
|
4
|
+
readonly description: "Fetch a document from the Hugging Face or Gradio documentation library. For large documents, use offset to get subsequent chunks.";
|
|
5
5
|
readonly schema: z.ZodObject<{
|
|
6
6
|
doc_url: z.ZodString;
|
|
7
7
|
offset: z.ZodOptional<z.ZodNumber>;
|
|
@@ -13,7 +13,7 @@ export declare const DOC_FETCH_CONFIG: {
|
|
|
13
13
|
offset?: number | undefined;
|
|
14
14
|
}>;
|
|
15
15
|
readonly annotations: {
|
|
16
|
-
readonly title: "Fetch a document from the Hugging Face library";
|
|
16
|
+
readonly title: "Fetch a document from the Hugging Face documentation library";
|
|
17
17
|
readonly destructiveHint: false;
|
|
18
18
|
readonly readOnlyHint: true;
|
|
19
19
|
readonly openWorldHint: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-fetch.d.ts","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"doc-fetch.d.ts","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;CAkBnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAErE,qBAAa,YAAY;IACxB,OAAO,CAAC,eAAe,CAAkB;;IAmFzC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAuB1B,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCpD,OAAO,CAAC,aAAa;CAoCrB"}
|
|
@@ -3,13 +3,9 @@ import TurndownService from 'turndown';
|
|
|
3
3
|
import { estimateTokens } from '../utilities.js';
|
|
4
4
|
export const DOC_FETCH_CONFIG = {
|
|
5
5
|
name: 'hf_doc_fetch',
|
|
6
|
-
description: 'Fetch a document from the Hugging Face documentation library. For large documents, use offset to get subsequent chunks.',
|
|
6
|
+
description: 'Fetch a document from the Hugging Face or Gradio documentation library. For large documents, use offset to get subsequent chunks.',
|
|
7
7
|
schema: z.object({
|
|
8
|
-
doc_url: z
|
|
9
|
-
.string()
|
|
10
|
-
.min(28, 'Url should start with https://huggingface.co/docs/')
|
|
11
|
-
.max(200, 'Query too long')
|
|
12
|
-
.describe('Hugging Face documentation URL'),
|
|
8
|
+
doc_url: z.string().max(200, 'Query too long').describe('Documentation URL (Hugging Face or Gradio)'),
|
|
13
9
|
offset: z
|
|
14
10
|
.number()
|
|
15
11
|
.min(0)
|
|
@@ -17,7 +13,7 @@ export const DOC_FETCH_CONFIG = {
|
|
|
17
13
|
.describe('Token offset for large documents (use the offset from truncation message)'),
|
|
18
14
|
}),
|
|
19
15
|
annotations: {
|
|
20
|
-
title: 'Fetch a document from the Hugging Face library',
|
|
16
|
+
title: 'Fetch a document from the Hugging Face documentation library',
|
|
21
17
|
destructiveHint: false,
|
|
22
18
|
readOnlyHint: true,
|
|
23
19
|
openWorldHint: true,
|
|
@@ -33,15 +29,84 @@ export class DocFetchTool {
|
|
|
33
29
|
this.turndownService.remove('head');
|
|
34
30
|
this.turndownService.remove('script');
|
|
35
31
|
this.turndownService.remove((node) => {
|
|
32
|
+
try {
|
|
33
|
+
const tag = (node.nodeName || '').toLowerCase();
|
|
34
|
+
if (['header', 'nav', 'footer', 'aside', 'form', 'button', 'style', 'noscript', 'iframe'].includes(tag)) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
});
|
|
42
|
+
this.turndownService.remove((node) => {
|
|
43
|
+
try {
|
|
44
|
+
if (typeof node.nodeName === 'string') {
|
|
45
|
+
const tag = (node.nodeName || '').toLowerCase();
|
|
46
|
+
if (tag === 'svg') {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
}
|
|
36
53
|
if (node.nodeName === 'a' && node.innerHTML.includes('<!-- HTML_TAG_START -->')) {
|
|
37
54
|
return true;
|
|
38
55
|
}
|
|
56
|
+
const nodeName = (node.nodeName || '').toLowerCase();
|
|
57
|
+
if (nodeName === 'img') {
|
|
58
|
+
try {
|
|
59
|
+
const src = node.getAttribute?.('src') ??
|
|
60
|
+
(node.src || '');
|
|
61
|
+
if (/\.svg(\?|$)/i.test(src) ||
|
|
62
|
+
/^data:image\/svg\+xml[,;]/i.test(src) ||
|
|
63
|
+
src.toLowerCase().includes('image/svg+xml')) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
}
|
|
69
|
+
}
|
|
39
70
|
return false;
|
|
40
71
|
});
|
|
72
|
+
this.turndownService.addRule('dropHeadingAnchors', {
|
|
73
|
+
filter: (node) => {
|
|
74
|
+
try {
|
|
75
|
+
const n = node;
|
|
76
|
+
if ((n.nodeName || '').toLowerCase() !== 'a')
|
|
77
|
+
return false;
|
|
78
|
+
const href = n.getAttribute?.('href') || '';
|
|
79
|
+
if (!href || !href.startsWith('#'))
|
|
80
|
+
return false;
|
|
81
|
+
const text = (n.textContent || '').trim();
|
|
82
|
+
const children = n.childNodes || [];
|
|
83
|
+
const onlyIcons = children.length > 0 && children.every((c) => ((c.nodeName || '').toLowerCase() === 'img' || (c.nodeName || '').toLowerCase() === 'svg'));
|
|
84
|
+
const looksLikeEncodedSvg = /data:image\/svg\+xml|%3csvg|svg%2bxml/i.test(text);
|
|
85
|
+
const noAlnumText = text.length <= 3 && !/[a-z0-9]/i.test(text);
|
|
86
|
+
return onlyIcons || looksLikeEncodedSvg || noAlnumText;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
replacement: () => ''
|
|
93
|
+
});
|
|
41
94
|
}
|
|
42
95
|
validateUrl(hfUrl) {
|
|
43
|
-
|
|
44
|
-
|
|
96
|
+
try {
|
|
97
|
+
const url = new URL(hfUrl);
|
|
98
|
+
if (url.protocol !== 'https:') {
|
|
99
|
+
throw new Error('That was not a valid documentation URL');
|
|
100
|
+
}
|
|
101
|
+
const hostname = url.hostname.toLowerCase();
|
|
102
|
+
const isHfDocs = (hostname === 'huggingface.co' || hostname === 'www.huggingface.co') && url.pathname.startsWith('/docs/');
|
|
103
|
+
const isGradio = hostname === 'gradio.app' || hostname === 'www.gradio.app';
|
|
104
|
+
if (!isHfDocs && !isGradio) {
|
|
105
|
+
throw new Error('That was not a valid documentation URL');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
throw new Error('That was not a valid documentation URL');
|
|
45
110
|
}
|
|
46
111
|
}
|
|
47
112
|
async fetch(params) {
|
|
@@ -52,7 +117,12 @@ export class DocFetchTool {
|
|
|
52
117
|
throw new Error(`Failed to fetch document: ${response.status} ${response.statusText}`);
|
|
53
118
|
}
|
|
54
119
|
const htmlContent = await response.text();
|
|
55
|
-
|
|
120
|
+
let fullMarkdownContent = this.turndownService.turndown(htmlContent);
|
|
121
|
+
fullMarkdownContent = fullMarkdownContent
|
|
122
|
+
.replace(/!\[[^\]]*\]\(\s*(?:data:image\/svg\+xml[^)]*|[^)]*\.svg(?:\?[^)]*)?)\s*\)/gi, '')
|
|
123
|
+
.replace(/\[\s*\]\(\s*[^)]*\s*\)/g, '');
|
|
124
|
+
fullMarkdownContent = fullMarkdownContent
|
|
125
|
+
.replace(/\[[^\]]*(?:data:image\/svg\+xml|%3csvg|svg%2bxml)[^\]]*\]\([^)]*\)/gi, '');
|
|
56
126
|
return this.applyChunking(fullMarkdownContent, params.offset || 0);
|
|
57
127
|
}
|
|
58
128
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-fetch.js","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,eAAe,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC/B,IAAI,EAAE,cAAc;IACpB,WAAW,EACV,
|
|
1
|
+
{"version":3,"file":"doc-fetch.js","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { DocFetchTool } from './doc-fetch.js';
|
|
|
3
3
|
describe('DocFetchTool', () => {
|
|
4
4
|
const tool = new DocFetchTool();
|
|
5
5
|
describe('URL validation', () => {
|
|
6
|
-
it('should accept valid HF docs URLs', () => {
|
|
6
|
+
it('should accept valid HF and Gradio docs URLs', () => {
|
|
7
7
|
const validUrls = [
|
|
8
8
|
'https://huggingface.co/docs/dataset-viewer/index',
|
|
9
9
|
'https://huggingface.co/docs/huggingface_hub/guides/upload#faster-uploads',
|
|
@@ -11,6 +11,8 @@ describe('DocFetchTool', () => {
|
|
|
11
11
|
'https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion',
|
|
12
12
|
'https://huggingface.co/docs/timm/models',
|
|
13
13
|
'https://huggingface.co/docs/transformers',
|
|
14
|
+
'https://gradio.app',
|
|
15
|
+
'https://www.gradio.app/guides',
|
|
14
16
|
];
|
|
15
17
|
for (const url of validUrls) {
|
|
16
18
|
expect(() => tool.validateUrl(url)).not.toThrow();
|
|
@@ -25,7 +27,7 @@ describe('DocFetchTool', () => {
|
|
|
25
27
|
'https://huggingface.co/models/bert-base-uncased',
|
|
26
28
|
];
|
|
27
29
|
for (const url of invalidUrls) {
|
|
28
|
-
expect(() => tool.validateUrl(url)).toThrow('That was not a valid
|
|
30
|
+
expect(() => tool.validateUrl(url)).toThrow('That was not a valid documentation URL');
|
|
29
31
|
}
|
|
30
32
|
});
|
|
31
33
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-fetch.test.js","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;IAEhC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"doc-fetch.test.js","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;IAEhC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACtD,MAAM,SAAS,GAAG;gBACjB,kDAAkD;gBAClD,0EAA0E;gBAC1E,yDAAyD;gBACzD,sEAAsE;gBACtE,yCAAyC;gBACzC,0CAA0C;gBAC1C,oBAAoB;gBACpB,+BAA+B;aAC/B,CAAC;YAEF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACnD,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;YACvE,MAAM,WAAW,GAAG;gBACnB,oCAAoC;gBACpC,6CAA6C;gBAC7C,yCAAyC;gBACzC,kCAAkC;gBAClC,iDAAiD;aACjD,CAAC;YAEF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;YACvF,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAG/D,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,yDAAyD,CAAC;aACtF,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;YAEjF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YAEzE,MAAM,QAAQ,GAAG,wBAAwB,GAAG,iKAAiK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1N,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACrC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;YAEjF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAE5D,MAAM,QAAQ,GAAG,wBAAwB,GAAG,iKAAiK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE1N,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;aACrC,CAAC,CAAC;YAGH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;YAGrF,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACxD,MAAM,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YAGrD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,MAAM,EAAE,CAAC,CAAC;YAE9F,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxC,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,8CAA8C,CAAC;aAC3E,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAEhG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
package/dist/hub-inspect.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import type { ToolResult } from './types/tool-result.js';
|
|
3
3
|
export declare const HUB_INSPECT_TOOL_CONFIG: {
|
|
4
|
-
readonly name: "
|
|
4
|
+
readonly name: "hub_repo_details";
|
|
5
5
|
readonly description: string;
|
|
6
6
|
readonly schema: z.ZodObject<{
|
|
7
7
|
repo_ids: z.ZodArray<z.ZodString, "many">;
|
|
@@ -17,7 +17,7 @@ export declare const HUB_INSPECT_TOOL_CONFIG: {
|
|
|
17
17
|
include_readme?: boolean | undefined;
|
|
18
18
|
}>;
|
|
19
19
|
readonly annotations: {
|
|
20
|
-
readonly title: "Hub
|
|
20
|
+
readonly title: "Hub Repo Details";
|
|
21
21
|
readonly destructiveHint: false;
|
|
22
22
|
readonly readOnlyHint: true;
|
|
23
23
|
readonly openWorldHint: false;
|
package/dist/hub-inspect.js
CHANGED
|
@@ -4,7 +4,7 @@ import { DatasetDetailTool } from './dataset-detail.js';
|
|
|
4
4
|
import { spaceInfo } from '@huggingface/hub';
|
|
5
5
|
import { formatDate } from './utilities.js';
|
|
6
6
|
export const HUB_INSPECT_TOOL_CONFIG = {
|
|
7
|
-
name: '
|
|
7
|
+
name: 'hub_repo_details',
|
|
8
8
|
description: 'Get details for one or more Hugging Face repos (model, dataset, or space). ' +
|
|
9
9
|
'Auto-detects type unless specified.',
|
|
10
10
|
schema: z.object({
|
|
@@ -17,7 +17,7 @@ export const HUB_INSPECT_TOOL_CONFIG = {
|
|
|
17
17
|
include_readme: z.boolean().default(true).describe('Include README from the repo'),
|
|
18
18
|
}),
|
|
19
19
|
annotations: {
|
|
20
|
-
title: 'Hub
|
|
20
|
+
title: 'Hub Repo Details',
|
|
21
21
|
destructiveHint: false,
|
|
22
22
|
readOnlyHint: true,
|
|
23
23
|
openWorldHint: false,
|
package/dist/hub-inspect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hub-inspect.js","sourceRoot":"","sources":["../src/hub-inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACtC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"hub-inspect.js","sourceRoot":"","sources":["../src/hub-inspect.ts"],"names":[],"mappings":"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"}
|
package/dist/tool-ids.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare const MODEL_DETAIL_TOOL_ID: "model_details";
|
|
|
4
4
|
export declare const PAPER_SEARCH_TOOL_ID: "paper_search";
|
|
5
5
|
export declare const DATASET_SEARCH_TOOL_ID: "dataset_search";
|
|
6
6
|
export declare const DATASET_DETAIL_TOOL_ID: "dataset_details";
|
|
7
|
-
export declare const HUB_INSPECT_TOOL_ID: "
|
|
7
|
+
export declare const HUB_INSPECT_TOOL_ID: "hub_repo_details";
|
|
8
8
|
export declare const DUPLICATE_SPACE_TOOL_ID: "duplicate_space";
|
|
9
9
|
export declare const SPACE_INFO_TOOL_ID: "space_info";
|
|
10
10
|
export declare const SPACE_FILES_TOOL_ID: "space_files";
|
|
@@ -14,14 +14,14 @@ export declare const USER_SUMMARY_PROMPT_ID: "User Summary";
|
|
|
14
14
|
export declare const PAPER_SUMMARY_PROMPT_ID: "Paper Summary";
|
|
15
15
|
export declare const MODEL_DETAIL_PROMPT_ID: string;
|
|
16
16
|
export declare const DATASET_DETAIL_PROMPT_ID: string;
|
|
17
|
-
export declare const ALL_BUILTIN_TOOL_IDS: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "
|
|
17
|
+
export declare const ALL_BUILTIN_TOOL_IDS: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "hub_repo_details", "duplicate_space", "space_info", "space_files", "hf_doc_search", "hf_doc_fetch"];
|
|
18
18
|
export declare const TOOL_ID_GROUPS: {
|
|
19
19
|
readonly search: readonly ["space_search", "model_search", "dataset_search", "paper_search", "hf_doc_search"];
|
|
20
20
|
readonly spaces: readonly ["space_search", "duplicate_space", "space_info", "space_files"];
|
|
21
|
-
readonly detail: readonly ["model_details", "dataset_details", "
|
|
21
|
+
readonly detail: readonly ["model_details", "dataset_details", "hub_repo_details"];
|
|
22
22
|
readonly docs: readonly ["hf_doc_search", "hf_doc_fetch"];
|
|
23
23
|
readonly hf_api: readonly ["space_search", "model_search", "dataset_search", "paper_search", "model_details", "dataset_details", "hf_doc_search"];
|
|
24
|
-
readonly all: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "
|
|
24
|
+
readonly all: readonly ["space_search", "model_search", "model_details", "paper_search", "dataset_search", "dataset_details", "hub_repo_details", "duplicate_space", "space_info", "space_files", "hf_doc_search", "hf_doc_fetch"];
|
|
25
25
|
};
|
|
26
26
|
export type BuiltinToolId = (typeof ALL_BUILTIN_TOOL_IDS)[number];
|
|
27
27
|
export declare function isValidBuiltinToolId(toolId: string): toolId is BuiltinToolId;
|
package/dist/tool-ids.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,oBAAoB,gBAAmC,CAAC;AACrE,eAAO,MAAM,oBAAoB,gBAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,iBAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,gBAAgC,CAAC;AAClE,eAAO,MAAM,sBAAsB,kBAAkC,CAAC;AACtE,eAAO,MAAM,sBAAsB,mBAAkC,CAAC;AACtE,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"tool-ids.d.ts","sourceRoot":"","sources":["../src/tool-ids.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,oBAAoB,gBAAmC,CAAC;AACrE,eAAO,MAAM,oBAAoB,gBAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,iBAAgC,CAAC;AAClE,eAAO,MAAM,oBAAoB,gBAAgC,CAAC;AAClE,eAAO,MAAM,sBAAsB,kBAAkC,CAAC;AACtE,eAAO,MAAM,sBAAsB,mBAAkC,CAAC;AACtE,eAAO,MAAM,mBAAmB,oBAA+B,CAAC;AAChE,eAAO,MAAM,uBAAuB,mBAAmC,CAAC;AACxE,eAAO,MAAM,kBAAkB,cAA8B,CAAC;AAC9D,eAAO,MAAM,mBAAmB,eAA+B,CAAC;AAChE,eAAO,MAAM,4BAA4B,iBAAmC,CAAC;AAC7E,eAAO,MAAM,iBAAiB,gBAAwB,CAAC;AACvD,eAAO,MAAM,sBAAsB,gBAAkC,CAAC;AACtE,eAAO,MAAM,uBAAuB,iBAAmC,CAAC;AACxE,eAAO,MAAM,sBAAsB,QAAkC,CAAC;AACtE,eAAO,MAAM,wBAAwB,QAAoC,CAAC;AAG1E,eAAO,MAAM,oBAAoB,sNAavB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;CAqBjB,CAAC;AAGX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAGlE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,aAAa,CAE5E"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@ describe('DocFetchTool', () => {
|
|
|
5
5
|
const tool = new DocFetchTool();
|
|
6
6
|
|
|
7
7
|
describe('URL validation', () => {
|
|
8
|
-
it('should accept valid HF docs URLs', () => {
|
|
8
|
+
it('should accept valid HF and Gradio docs URLs', () => {
|
|
9
9
|
const validUrls = [
|
|
10
10
|
'https://huggingface.co/docs/dataset-viewer/index',
|
|
11
11
|
'https://huggingface.co/docs/huggingface_hub/guides/upload#faster-uploads',
|
|
@@ -13,6 +13,8 @@ describe('DocFetchTool', () => {
|
|
|
13
13
|
'https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion',
|
|
14
14
|
'https://huggingface.co/docs/timm/models',
|
|
15
15
|
'https://huggingface.co/docs/transformers',
|
|
16
|
+
'https://gradio.app',
|
|
17
|
+
'https://www.gradio.app/guides',
|
|
16
18
|
];
|
|
17
19
|
|
|
18
20
|
for (const url of validUrls) {
|
|
@@ -30,7 +32,7 @@ describe('DocFetchTool', () => {
|
|
|
30
32
|
];
|
|
31
33
|
|
|
32
34
|
for (const url of invalidUrls) {
|
|
33
|
-
expect(() => tool.validateUrl(url)).toThrow('That was not a valid
|
|
35
|
+
expect(() => tool.validateUrl(url)).toThrow('That was not a valid documentation URL');
|
|
34
36
|
}
|
|
35
37
|
});
|
|
36
38
|
});
|
|
@@ -102,4 +104,4 @@ describe('DocFetchTool', () => {
|
|
|
102
104
|
expect(result).toContain('Error: Offset 10000 is beyond');
|
|
103
105
|
});
|
|
104
106
|
});
|
|
105
|
-
});
|
|
107
|
+
});
|
|
@@ -5,13 +5,9 @@ import { estimateTokens } from '../utilities.js';
|
|
|
5
5
|
export const DOC_FETCH_CONFIG = {
|
|
6
6
|
name: 'hf_doc_fetch',
|
|
7
7
|
description:
|
|
8
|
-
'Fetch a document from the Hugging Face documentation library. For large documents, use offset to get subsequent chunks.',
|
|
8
|
+
'Fetch a document from the Hugging Face or Gradio documentation library. For large documents, use offset to get subsequent chunks.',
|
|
9
9
|
schema: z.object({
|
|
10
|
-
doc_url: z
|
|
11
|
-
.string()
|
|
12
|
-
.min(28, 'Url should start with https://huggingface.co/docs/')
|
|
13
|
-
.max(200, 'Query too long')
|
|
14
|
-
.describe('Hugging Face documentation URL'),
|
|
10
|
+
doc_url: z.string().max(200, 'Query too long').describe('Documentation URL (Hugging Face or Gradio)'),
|
|
15
11
|
offset: z
|
|
16
12
|
.number()
|
|
17
13
|
.min(0)
|
|
@@ -19,7 +15,7 @@ export const DOC_FETCH_CONFIG = {
|
|
|
19
15
|
.describe('Token offset for large documents (use the offset from truncation message)'),
|
|
20
16
|
}),
|
|
21
17
|
annotations: {
|
|
22
|
-
title: 'Fetch a document from the Hugging Face library',
|
|
18
|
+
title: 'Fetch a document from the Hugging Face documentation library',
|
|
23
19
|
destructiveHint: false,
|
|
24
20
|
readOnlyHint: true,
|
|
25
21
|
openWorldHint: true,
|
|
@@ -38,20 +34,97 @@ export class DocFetchTool {
|
|
|
38
34
|
});
|
|
39
35
|
this.turndownService.remove('head');
|
|
40
36
|
this.turndownService.remove('script');
|
|
37
|
+
|
|
38
|
+
// Drop common non-content containers to reduce noise
|
|
39
|
+
this.turndownService.remove((node) => {
|
|
40
|
+
try {
|
|
41
|
+
const tag = ((node as unknown as { nodeName?: string }).nodeName || '').toLowerCase();
|
|
42
|
+
if (['header', 'nav', 'footer', 'aside', 'form', 'button', 'style', 'noscript', 'iframe'].includes(tag)) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
} catch {
|
|
46
|
+
/* ignore */
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
});
|
|
41
50
|
this.turndownService.remove((node) => {
|
|
51
|
+
// Strip inline SVGs as they are noisy and rarely useful in text docs
|
|
52
|
+
try {
|
|
53
|
+
if (typeof (node as unknown as { nodeName?: string }).nodeName === 'string') {
|
|
54
|
+
const tag = ((node as unknown as { nodeName: string }).nodeName || '').toLowerCase();
|
|
55
|
+
if (tag === 'svg') {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
} catch {
|
|
60
|
+
/* ignore */
|
|
61
|
+
}
|
|
62
|
+
|
|
42
63
|
if (node.nodeName === 'a' && node.innerHTML.includes('<!-- HTML_TAG_START -->')) {
|
|
43
64
|
return true;
|
|
44
65
|
}
|
|
66
|
+
// Remove <img ... src="...svg"> or data-uri SVGs to avoid markdown noise
|
|
67
|
+
const nodeName = ((node as unknown as { nodeName?: string }).nodeName || '').toLowerCase();
|
|
68
|
+
if (nodeName === 'img') {
|
|
69
|
+
try {
|
|
70
|
+
const src = (node as unknown as { getAttribute?: (name: string) => string | null }).getAttribute?.('src') ??
|
|
71
|
+
((node as unknown as { src?: string }).src || '');
|
|
72
|
+
if (
|
|
73
|
+
/\.svg(\?|$)/i.test(src) ||
|
|
74
|
+
/^data:image\/svg\+xml[,;]/i.test(src) ||
|
|
75
|
+
src.toLowerCase().includes('image/svg+xml')
|
|
76
|
+
) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
} catch {
|
|
80
|
+
/* ignore */
|
|
81
|
+
}
|
|
82
|
+
}
|
|
45
83
|
return false;
|
|
46
84
|
});
|
|
85
|
+
|
|
86
|
+
// Drop anchor-only heading icons or anchors containing encoded SVG payloads
|
|
87
|
+
this.turndownService.addRule('dropHeadingAnchors', {
|
|
88
|
+
filter: (node) => {
|
|
89
|
+
try {
|
|
90
|
+
const n = node as unknown as { nodeName?: string; getAttribute?: (k: string) => string | null; textContent?: string; childNodes?: Array<{ nodeName?: string }> };
|
|
91
|
+
if ((n.nodeName || '').toLowerCase() !== 'a') return false;
|
|
92
|
+
const href = n.getAttribute?.('href') || '';
|
|
93
|
+
if (!href || !href.startsWith('#')) return false;
|
|
94
|
+
const text = (n.textContent || '').trim();
|
|
95
|
+
const children = (n as unknown as { childNodes?: Array<{ nodeName?: string }> }).childNodes || [];
|
|
96
|
+
const onlyIcons = children.length > 0 && children.every((c) => ((c.nodeName || '').toLowerCase() === 'img' || (c.nodeName || '').toLowerCase() === 'svg'));
|
|
97
|
+
const looksLikeEncodedSvg = /data:image\/svg\+xml|%3csvg|svg%2bxml/i.test(text);
|
|
98
|
+
const noAlnumText = text.length <= 3 && !/[a-z0-9]/i.test(text);
|
|
99
|
+
return onlyIcons || looksLikeEncodedSvg || noAlnumText;
|
|
100
|
+
} catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
replacement: () => ''
|
|
105
|
+
});
|
|
47
106
|
}
|
|
48
107
|
|
|
49
108
|
/**
|
|
50
109
|
* Validate HF docs URL
|
|
51
110
|
*/
|
|
52
111
|
validateUrl(hfUrl: string): void {
|
|
53
|
-
|
|
54
|
-
|
|
112
|
+
try {
|
|
113
|
+
const url = new URL(hfUrl);
|
|
114
|
+
if (url.protocol !== 'https:') {
|
|
115
|
+
throw new Error('That was not a valid documentation URL');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const hostname = url.hostname.toLowerCase();
|
|
119
|
+
const isHfDocs =
|
|
120
|
+
(hostname === 'huggingface.co' || hostname === 'www.huggingface.co') && url.pathname.startsWith('/docs/');
|
|
121
|
+
const isGradio = hostname === 'gradio.app' || hostname === 'www.gradio.app';
|
|
122
|
+
|
|
123
|
+
if (!isHfDocs && !isGradio) {
|
|
124
|
+
throw new Error('That was not a valid documentation URL');
|
|
125
|
+
}
|
|
126
|
+
} catch {
|
|
127
|
+
throw new Error('That was not a valid documentation URL');
|
|
55
128
|
}
|
|
56
129
|
}
|
|
57
130
|
|
|
@@ -71,7 +144,18 @@ export class DocFetchTool {
|
|
|
71
144
|
const htmlContent = await response.text();
|
|
72
145
|
|
|
73
146
|
// Convert HTML to Markdown
|
|
74
|
-
|
|
147
|
+
let fullMarkdownContent = this.turndownService.turndown(htmlContent);
|
|
148
|
+
|
|
149
|
+
// Post-process: strip any leftover SVG images that slipped past DOM filters
|
|
150
|
+
// - Markdown images pointing to data:image/svg+xml or *.svg
|
|
151
|
+
// - Empty links left behind after image removal: [](...)
|
|
152
|
+
fullMarkdownContent = fullMarkdownContent
|
|
153
|
+
.replace(/!\[[^\]]*\]\(\s*(?:data:image\/svg\+xml[^)]*|[^)]*\.svg(?:\?[^)]*)?)\s*\)/gi, '')
|
|
154
|
+
.replace(/\[\s*\]\(\s*[^)]*\s*\)/g, '');
|
|
155
|
+
|
|
156
|
+
// Remove anchors whose link text still contains encoded SVG payloads (edge cases)
|
|
157
|
+
fullMarkdownContent = fullMarkdownContent
|
|
158
|
+
.replace(/\[[^\]]*(?:data:image\/svg\+xml|%3csvg|svg%2bxml)[^\]]*\]\([^)]*\)/gi, '');
|
|
75
159
|
|
|
76
160
|
// Apply chunking logic
|
|
77
161
|
return this.applyChunking(fullMarkdownContent, params.offset || 0);
|
package/src/hub-inspect.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { spaceInfo } from '@huggingface/hub';
|
|
|
6
6
|
import { formatDate } from './utilities.js';
|
|
7
7
|
|
|
8
8
|
export const HUB_INSPECT_TOOL_CONFIG = {
|
|
9
|
-
name: '
|
|
9
|
+
name: 'hub_repo_details',
|
|
10
10
|
description:
|
|
11
11
|
'Get details for one or more Hugging Face repos (model, dataset, or space). ' +
|
|
12
12
|
'Auto-detects type unless specified.',
|
|
@@ -20,7 +20,7 @@ export const HUB_INSPECT_TOOL_CONFIG = {
|
|
|
20
20
|
include_readme: z.boolean().default(true).describe('Include README from the repo'),
|
|
21
21
|
}),
|
|
22
22
|
annotations: {
|
|
23
|
-
title: 'Hub
|
|
23
|
+
title: 'Hub Repo Details',
|
|
24
24
|
destructiveHint: false,
|
|
25
25
|
readOnlyHint: true,
|
|
26
26
|
openWorldHint: false,
|