@llmindset/hf-mcp 0.2.19 → 0.2.21
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 +3 -2
- package/dist/docs-search/doc-fetch.d.ts.map +1 -1
- package/dist/docs-search/doc-fetch.js +97 -12
- package/dist/docs-search/doc-fetch.js.map +1 -1
- package/dist/docs-search/doc-fetch.test.js +16 -3
- 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 +19 -5
- package/src/docs-search/doc-fetch.ts +117 -12
- 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;
|
|
@@ -27,4 +27,5 @@ export declare class DocFetchTool {
|
|
|
27
27
|
fetch(params: DocFetchParams): Promise<string>;
|
|
28
28
|
private applyChunking;
|
|
29
29
|
}
|
|
30
|
+
export declare function normalizeDocUrl(input: string): string;
|
|
30
31
|
//# sourceMappingURL=doc-fetch.d.ts.map
|
|
@@ -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;IAuCpD,OAAO,CAAC,aAAa;CAoCrB;AAMD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYrD"}
|
|
@@ -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,26 +29,101 @@ 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) {
|
|
48
113
|
try {
|
|
49
|
-
|
|
50
|
-
|
|
114
|
+
const normalizedUrl = normalizeDocUrl(params.doc_url);
|
|
115
|
+
this.validateUrl(normalizedUrl);
|
|
116
|
+
const response = await fetch(normalizedUrl);
|
|
51
117
|
if (!response.ok) {
|
|
52
118
|
throw new Error(`Failed to fetch document: ${response.status} ${response.statusText}`);
|
|
53
119
|
}
|
|
54
120
|
const htmlContent = await response.text();
|
|
55
|
-
|
|
121
|
+
let fullMarkdownContent = this.turndownService.turndown(htmlContent);
|
|
122
|
+
fullMarkdownContent = fullMarkdownContent
|
|
123
|
+
.replace(/!\[[^\]]*\]\(\s*(?:data:image\/svg\+xml[^)]*|[^)]*\.svg(?:\?[^)]*)?)\s*\)/gi, '')
|
|
124
|
+
.replace(/\[\s*\]\(\s*[^)]*\s*\)/g, '');
|
|
125
|
+
fullMarkdownContent = fullMarkdownContent
|
|
126
|
+
.replace(/\[[^\]]*(?:data:image\/svg\+xml|%3csvg|svg%2bxml)[^\]]*\]\([^)]*\)/gi, '');
|
|
56
127
|
return this.applyChunking(fullMarkdownContent, params.offset || 0);
|
|
57
128
|
}
|
|
58
129
|
catch (error) {
|
|
@@ -83,4 +154,18 @@ export class DocFetchTool {
|
|
|
83
154
|
return result;
|
|
84
155
|
}
|
|
85
156
|
}
|
|
157
|
+
export function normalizeDocUrl(input) {
|
|
158
|
+
try {
|
|
159
|
+
const url = new URL(input);
|
|
160
|
+
const host = url.hostname.toLowerCase();
|
|
161
|
+
if (host === 'gradio.app') {
|
|
162
|
+
url.hostname = 'www.gradio.app';
|
|
163
|
+
return url.toString();
|
|
164
|
+
}
|
|
165
|
+
return input;
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return input;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
86
171
|
//# sourceMappingURL=doc-fetch.js.map
|
|
@@ -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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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { DocFetchTool } from './doc-fetch.js';
|
|
2
|
+
import { DocFetchTool, normalizeDocUrl } 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
|
});
|
|
@@ -51,6 +53,17 @@ describe('DocFetchTool', () => {
|
|
|
51
53
|
expect(result).toContain('DOCUMENT TRUNCATED');
|
|
52
54
|
expect(result).toContain('CALL hf_doc_fetch WITH AN OFFSET OF');
|
|
53
55
|
});
|
|
56
|
+
it('normalizes gradio.app to www.gradio.app (pure function)', () => {
|
|
57
|
+
const cases = [
|
|
58
|
+
{ in: 'https://gradio.app/guides/x', out: 'https://www.gradio.app/guides/x' },
|
|
59
|
+
{ in: 'https://www.gradio.app/guides/x', out: 'https://www.gradio.app/guides/x' },
|
|
60
|
+
{ in: 'https://huggingface.co/docs/transformers', out: 'https://huggingface.co/docs/transformers' },
|
|
61
|
+
{ in: 'not a url', out: 'not a url' },
|
|
62
|
+
];
|
|
63
|
+
for (const c of cases) {
|
|
64
|
+
expect(normalizeDocUrl(c.in)).toBe(c.out);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
54
67
|
it('should return subsequent chunks with offset', async () => {
|
|
55
68
|
const longHtml = '<h1>Long Document</h1>' + '<p>This is a very long sentence that will be repeated many times to create a document that exceeds the 7500 token limit for testing chunking functionality.</p>'.repeat(200);
|
|
56
69
|
global.fetch = vi.fn().mockResolvedValue({
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"doc-fetch.test.js","sourceRoot":"","sources":["../../src/docs-search/doc-fetch.test.ts"],"names":[],"mappings":"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"}
|
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
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { DocFetchTool } from './doc-fetch.js';
|
|
2
|
+
import { DocFetchTool, normalizeDocUrl } from './doc-fetch.js';
|
|
3
3
|
|
|
4
4
|
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
|
});
|
|
@@ -67,6 +69,18 @@ describe('DocFetchTool', () => {
|
|
|
67
69
|
expect(result).toContain('CALL hf_doc_fetch WITH AN OFFSET OF');
|
|
68
70
|
});
|
|
69
71
|
|
|
72
|
+
it('normalizes gradio.app to www.gradio.app (pure function)', () => {
|
|
73
|
+
const cases: Array<{ in: string; out: string }> = [
|
|
74
|
+
{ in: 'https://gradio.app/guides/x', out: 'https://www.gradio.app/guides/x' },
|
|
75
|
+
{ in: 'https://www.gradio.app/guides/x', out: 'https://www.gradio.app/guides/x' },
|
|
76
|
+
{ in: 'https://huggingface.co/docs/transformers', out: 'https://huggingface.co/docs/transformers' },
|
|
77
|
+
{ in: 'not a url', out: 'not a url' },
|
|
78
|
+
];
|
|
79
|
+
for (const c of cases) {
|
|
80
|
+
expect(normalizeDocUrl(c.in)).toBe(c.out);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
70
84
|
it('should return subsequent chunks with offset', async () => {
|
|
71
85
|
// Mock fetch to return the same long HTML
|
|
72
86
|
const longHtml = '<h1>Long Document</h1>' + '<p>This is a very long sentence that will be repeated many times to create a document that exceeds the 7500 token limit for testing chunking functionality.</p>'.repeat(200);
|
|
@@ -102,4 +116,4 @@ describe('DocFetchTool', () => {
|
|
|
102
116
|
expect(result).toContain('Error: Offset 10000 is beyond');
|
|
103
117
|
});
|
|
104
118
|
});
|
|
105
|
-
});
|
|
119
|
+
});
|
|
@@ -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
|
|
|
@@ -60,9 +133,10 @@ export class DocFetchTool {
|
|
|
60
133
|
*/
|
|
61
134
|
async fetch(params: DocFetchParams): Promise<string> {
|
|
62
135
|
try {
|
|
63
|
-
|
|
136
|
+
const normalizedUrl = normalizeDocUrl(params.doc_url);
|
|
137
|
+
this.validateUrl(normalizedUrl);
|
|
64
138
|
|
|
65
|
-
const response = await fetch(
|
|
139
|
+
const response = await fetch(normalizedUrl);
|
|
66
140
|
|
|
67
141
|
if (!response.ok) {
|
|
68
142
|
throw new Error(`Failed to fetch document: ${response.status} ${response.statusText}`);
|
|
@@ -71,7 +145,18 @@ export class DocFetchTool {
|
|
|
71
145
|
const htmlContent = await response.text();
|
|
72
146
|
|
|
73
147
|
// Convert HTML to Markdown
|
|
74
|
-
|
|
148
|
+
let fullMarkdownContent = this.turndownService.turndown(htmlContent);
|
|
149
|
+
|
|
150
|
+
// Post-process: strip any leftover SVG images that slipped past DOM filters
|
|
151
|
+
// - Markdown images pointing to data:image/svg+xml or *.svg
|
|
152
|
+
// - Empty links left behind after image removal: [](...)
|
|
153
|
+
fullMarkdownContent = fullMarkdownContent
|
|
154
|
+
.replace(/!\[[^\]]*\]\(\s*(?:data:image\/svg\+xml[^)]*|[^)]*\.svg(?:\?[^)]*)?)\s*\)/gi, '')
|
|
155
|
+
.replace(/\[\s*\]\(\s*[^)]*\s*\)/g, '');
|
|
156
|
+
|
|
157
|
+
// Remove anchors whose link text still contains encoded SVG payloads (edge cases)
|
|
158
|
+
fullMarkdownContent = fullMarkdownContent
|
|
159
|
+
.replace(/\[[^\]]*(?:data:image\/svg\+xml|%3csvg|svg%2bxml)[^\]]*\]\([^)]*\)/gi, '');
|
|
75
160
|
|
|
76
161
|
// Apply chunking logic
|
|
77
162
|
return this.applyChunking(fullMarkdownContent, params.offset || 0);
|
|
@@ -80,6 +165,8 @@ export class DocFetchTool {
|
|
|
80
165
|
}
|
|
81
166
|
}
|
|
82
167
|
|
|
168
|
+
|
|
169
|
+
|
|
83
170
|
/**
|
|
84
171
|
* Apply chunking logic to markdown content
|
|
85
172
|
*/
|
|
@@ -120,3 +207,21 @@ export class DocFetchTool {
|
|
|
120
207
|
return result;
|
|
121
208
|
}
|
|
122
209
|
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Normalize incoming documentation URLs for known domains
|
|
213
|
+
* - Convert gradio.app → www.gradio.app so pages resolve correctly
|
|
214
|
+
*/
|
|
215
|
+
export function normalizeDocUrl(input: string): string {
|
|
216
|
+
try {
|
|
217
|
+
const url = new URL(input);
|
|
218
|
+
const host = url.hostname.toLowerCase();
|
|
219
|
+
if (host === 'gradio.app') {
|
|
220
|
+
url.hostname = 'www.gradio.app';
|
|
221
|
+
return url.toString();
|
|
222
|
+
}
|
|
223
|
+
return input;
|
|
224
|
+
} catch {
|
|
225
|
+
return input;
|
|
226
|
+
}
|
|
227
|
+
}
|
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,
|