@llmindset/hf-mcp 0.2.9 → 0.2.10
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/gradio-files.d.ts +44 -0
- package/dist/gradio-files.d.ts.map +1 -0
- package/dist/gradio-files.js +198 -0
- package/dist/gradio-files.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/space-files.d.ts +1 -1
- package/package.json +1 -1
- package/src/gradio-files.ts +257 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
interface FileWithUrl {
|
|
3
|
+
path: string;
|
|
4
|
+
size: number;
|
|
5
|
+
type: 'file' | 'directory' | 'unknown';
|
|
6
|
+
url: string;
|
|
7
|
+
sizeFormatted: string;
|
|
8
|
+
lastModified?: string;
|
|
9
|
+
lfs: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const GRADIO_FILES_TOOL_CONFIG: {
|
|
12
|
+
readonly name: "gradio_files";
|
|
13
|
+
readonly description: "List available URLs that can be used for Gradio File Inputs. Use when an input is requested and an explicit URL has not been provided.";
|
|
14
|
+
readonly schema: z.ZodObject<{
|
|
15
|
+
fileType: z.ZodDefault<z.ZodOptional<z.ZodEnum<["all", "image", "audio", "text"]>>>;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
fileType: "all" | "image" | "audio" | "text";
|
|
18
|
+
}, {
|
|
19
|
+
fileType?: "all" | "image" | "audio" | "text" | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
readonly annotations: {
|
|
22
|
+
readonly title: "Gradio Files List";
|
|
23
|
+
readonly destructiveHint: false;
|
|
24
|
+
readonly readOnlyHint: true;
|
|
25
|
+
readonly openWorldHint: true;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export declare const GRADIO_FILES_PROMPT_CONFIG: {
|
|
29
|
+
name: string;
|
|
30
|
+
description: string;
|
|
31
|
+
schema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
32
|
+
};
|
|
33
|
+
export type GradioFilesParams = z.infer<typeof GRADIO_FILES_TOOL_CONFIG.schema>;
|
|
34
|
+
export declare class GradioFilesTool {
|
|
35
|
+
private readonly accessToken;
|
|
36
|
+
private readonly datasetname;
|
|
37
|
+
constructor(hfToken: string, username: string);
|
|
38
|
+
getGradioFiles(): Promise<FileWithUrl[]>;
|
|
39
|
+
private constructFileUrl;
|
|
40
|
+
generateDetailedMarkdown(fileType?: 'all' | 'image' | 'audio' | 'text'): Promise<string>;
|
|
41
|
+
private getFileIcon;
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=gradio-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradio-files.d.ts","sourceRoot":"","sources":["../src/gradio-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,UAAU,WAAW;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,OAAO,CAAC;CACb;AAgFD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;CAa3B,CAAC;AAEX,eAAO,MAAM,0BAA0B;;;;CAItC,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAKhF,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAQvC,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IA0C9C,OAAO,CAAC,gBAAgB;IAOlB,wBAAwB,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,MAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAsCrG,OAAO,CAAC,WAAW;CAmCnB"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { listFiles } from '@huggingface/hub';
|
|
3
|
+
import { formatBytes, escapeMarkdown } from './utilities.js';
|
|
4
|
+
import { HfApiError } from './hf-api-call.js';
|
|
5
|
+
import { explain } from './error-messages.js';
|
|
6
|
+
const IMAGE_EXTENSIONS = new Set([
|
|
7
|
+
'.jpg',
|
|
8
|
+
'.jpeg',
|
|
9
|
+
'.png',
|
|
10
|
+
'.gif',
|
|
11
|
+
'.bmp',
|
|
12
|
+
'.tiff',
|
|
13
|
+
'.tif',
|
|
14
|
+
'.webp',
|
|
15
|
+
'.svg',
|
|
16
|
+
'.ico',
|
|
17
|
+
'.heic',
|
|
18
|
+
'.heif',
|
|
19
|
+
]);
|
|
20
|
+
const AUDIO_EXTENSIONS = new Set([
|
|
21
|
+
'.mp3',
|
|
22
|
+
'.wav',
|
|
23
|
+
'.flac',
|
|
24
|
+
'.aac',
|
|
25
|
+
'.ogg',
|
|
26
|
+
'.m4a',
|
|
27
|
+
'.wma',
|
|
28
|
+
'.opus',
|
|
29
|
+
'.aiff',
|
|
30
|
+
'.au',
|
|
31
|
+
'.ra',
|
|
32
|
+
]);
|
|
33
|
+
const TEXT_EXTENSIONS = new Set([
|
|
34
|
+
'.txt',
|
|
35
|
+
'.md',
|
|
36
|
+
'json',
|
|
37
|
+
'xml',
|
|
38
|
+
'.csv',
|
|
39
|
+
'.tsv',
|
|
40
|
+
'yaml',
|
|
41
|
+
'.yml',
|
|
42
|
+
'.html',
|
|
43
|
+
'.css',
|
|
44
|
+
'.js',
|
|
45
|
+
'.py',
|
|
46
|
+
]);
|
|
47
|
+
function getFileExtension(path) {
|
|
48
|
+
const lastDot = path.lastIndexOf('.');
|
|
49
|
+
return lastDot === -1 ? '' : path.substring(lastDot).toLowerCase();
|
|
50
|
+
}
|
|
51
|
+
function isImageFile(path) {
|
|
52
|
+
return IMAGE_EXTENSIONS.has(getFileExtension(path));
|
|
53
|
+
}
|
|
54
|
+
function isAudioFile(path) {
|
|
55
|
+
return AUDIO_EXTENSIONS.has(getFileExtension(path));
|
|
56
|
+
}
|
|
57
|
+
function isTextFile(path) {
|
|
58
|
+
return TEXT_EXTENSIONS.has(getFileExtension(path));
|
|
59
|
+
}
|
|
60
|
+
function matchesFileType(file, fileType) {
|
|
61
|
+
switch (fileType) {
|
|
62
|
+
case 'all':
|
|
63
|
+
return true;
|
|
64
|
+
case 'image':
|
|
65
|
+
return isImageFile(file.path);
|
|
66
|
+
case 'audio':
|
|
67
|
+
return isAudioFile(file.path);
|
|
68
|
+
case 'text':
|
|
69
|
+
return isTextFile(file.path);
|
|
70
|
+
default:
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export const GRADIO_FILES_TOOL_CONFIG = {
|
|
75
|
+
name: 'gradio_files',
|
|
76
|
+
description: 'List available URLs that can be used for Gradio File Inputs. Use when an input is requested and an explicit URL has not been provided.',
|
|
77
|
+
schema: z.object({
|
|
78
|
+
fileType: z.enum(['all', 'image', 'audio', 'text']).optional().default('all').describe('Filter by type'),
|
|
79
|
+
}),
|
|
80
|
+
annotations: {
|
|
81
|
+
title: 'Gradio Files List',
|
|
82
|
+
destructiveHint: false,
|
|
83
|
+
readOnlyHint: true,
|
|
84
|
+
openWorldHint: true,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
export const GRADIO_FILES_PROMPT_CONFIG = {
|
|
88
|
+
name: 'Available Gradio Input Files',
|
|
89
|
+
description: 'Returns a list of files and their URLs to use as Gradio File Inputs.',
|
|
90
|
+
schema: z.object({}),
|
|
91
|
+
};
|
|
92
|
+
export class GradioFilesTool {
|
|
93
|
+
accessToken;
|
|
94
|
+
datasetname;
|
|
95
|
+
constructor(hfToken, username) {
|
|
96
|
+
this.accessToken = hfToken;
|
|
97
|
+
this.datasetname = `${username}/gradio-files`;
|
|
98
|
+
}
|
|
99
|
+
async getGradioFiles() {
|
|
100
|
+
try {
|
|
101
|
+
const files = [];
|
|
102
|
+
for await (const file of listFiles({
|
|
103
|
+
repo: { type: 'dataset', name: this.datasetname },
|
|
104
|
+
recursive: false,
|
|
105
|
+
expand: true,
|
|
106
|
+
...(this.accessToken && { credentials: { accessToken: this.accessToken } }),
|
|
107
|
+
})) {
|
|
108
|
+
if (file.type === 'file') {
|
|
109
|
+
const fileName = file.path.split('/').pop() || file.path;
|
|
110
|
+
if (fileName === '.gitattributes' || fileName === '.gitignore') {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
files.push({
|
|
114
|
+
path: file.path,
|
|
115
|
+
size: file.size,
|
|
116
|
+
type: file.type,
|
|
117
|
+
url: this.constructFileUrl(file.path),
|
|
118
|
+
sizeFormatted: formatBytes(file.size),
|
|
119
|
+
lastModified: file.lastCommit?.date,
|
|
120
|
+
lfs: !!file.lfs,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return files.sort((a, b) => a.path.localeCompare(b.path));
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
if (error instanceof HfApiError) {
|
|
128
|
+
throw explain(error, `Failed to list files for dataset "${this.datasetname}"`);
|
|
129
|
+
}
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
constructFileUrl(filePath) {
|
|
134
|
+
return `https://huggingface.co/datasets/${this.datasetname}/resolve/main/${filePath}`;
|
|
135
|
+
}
|
|
136
|
+
async generateDetailedMarkdown(fileType = 'all') {
|
|
137
|
+
const allFiles = await this.getGradioFiles();
|
|
138
|
+
const files = allFiles.filter((file) => matchesFileType(file, fileType));
|
|
139
|
+
let markdown = `# Available Gradio Input files in : ${this.datasetname}\n\n`;
|
|
140
|
+
if (fileType !== 'all') {
|
|
141
|
+
markdown += `**Filter**: ${fileType} files only\n`;
|
|
142
|
+
}
|
|
143
|
+
if (files.length === 0) {
|
|
144
|
+
if (fileType !== 'all') {
|
|
145
|
+
markdown += `No ${fileType} files found in this space.\n`;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
markdown += `No files found in this space.\n`;
|
|
149
|
+
}
|
|
150
|
+
return markdown;
|
|
151
|
+
}
|
|
152
|
+
markdown += `## All Files\n\n`;
|
|
153
|
+
markdown += `| Name | Size | Type | Last Modified | Gradio File Input |\n`;
|
|
154
|
+
markdown += `|------|------|------|---------------|-----|\n`;
|
|
155
|
+
for (const file of files) {
|
|
156
|
+
const fileName = file.path.split('/').pop() || file.path;
|
|
157
|
+
const icon = this.getFileIcon(fileName);
|
|
158
|
+
const lastMod = file.lastModified ? new Date(file.lastModified).toLocaleDateString() : '-';
|
|
159
|
+
markdown += `| ${escapeMarkdown(fileName)} | ${file.sizeFormatted} | ${icon} ${file.type} | ${lastMod} | ${file.url} |\n`;
|
|
160
|
+
}
|
|
161
|
+
return markdown;
|
|
162
|
+
}
|
|
163
|
+
getFileIcon(filename) {
|
|
164
|
+
const ext = filename.split('.').pop()?.toLowerCase();
|
|
165
|
+
const iconMap = {
|
|
166
|
+
py: '🐍',
|
|
167
|
+
js: '📜',
|
|
168
|
+
ts: '📘',
|
|
169
|
+
md: '📝',
|
|
170
|
+
txt: '📄',
|
|
171
|
+
json: '📊',
|
|
172
|
+
yaml: '⚙️',
|
|
173
|
+
yml: '⚙️',
|
|
174
|
+
png: '🖼️',
|
|
175
|
+
jpg: '🖼️',
|
|
176
|
+
jpeg: '🖼️',
|
|
177
|
+
gif: '🖼️',
|
|
178
|
+
svg: '🎨',
|
|
179
|
+
mp4: '🎬',
|
|
180
|
+
mp3: '🎵',
|
|
181
|
+
pdf: '📕',
|
|
182
|
+
zip: '📦',
|
|
183
|
+
tar: '📦',
|
|
184
|
+
gz: '📦',
|
|
185
|
+
html: '🌐',
|
|
186
|
+
css: '🎨',
|
|
187
|
+
ipynb: '📓',
|
|
188
|
+
csv: '📊',
|
|
189
|
+
parquet: '🗄️',
|
|
190
|
+
safetensors: '🤖',
|
|
191
|
+
bin: '💾',
|
|
192
|
+
pkl: '🥒',
|
|
193
|
+
h5: '🗃️',
|
|
194
|
+
};
|
|
195
|
+
return iconMap[ext || ''] || '📄';
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=gradio-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradio-files.js","sourceRoot":"","sources":["../src/gradio-files.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export * from './dataset-detail.js';
|
|
|
10
10
|
export * from './duplicate-space.js';
|
|
11
11
|
export * from './space-info.js';
|
|
12
12
|
export * from './space-files.js';
|
|
13
|
+
export * from './gradio-files.js';
|
|
13
14
|
export * from './user-summary.js';
|
|
14
15
|
export * from './paper-summary.js';
|
|
15
16
|
export * from './docs-search/docs-semantic-search.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ export * from './dataset-detail.js';
|
|
|
10
10
|
export * from './duplicate-space.js';
|
|
11
11
|
export * from './space-info.js';
|
|
12
12
|
export * from './space-files.js';
|
|
13
|
+
export * from './gradio-files.js';
|
|
13
14
|
export * from './user-summary.js';
|
|
14
15
|
export * from './paper-summary.js';
|
|
15
16
|
export * from './docs-search/docs-semantic-search.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uCAAuC,CAAC;AACtD,cAAc,4BAA4B,CAAC;AAG3C,cAAc,wBAAwB,CAAC;AAGvC,cAAc,eAAe,CAAC"}
|
package/dist/space-files.d.ts
CHANGED
|
@@ -18,8 +18,8 @@ export declare const SPACE_FILES_TOOL_CONFIG: {
|
|
|
18
18
|
fileType: "all" | "image" | "audio";
|
|
19
19
|
spaceName?: string | undefined;
|
|
20
20
|
}, {
|
|
21
|
-
spaceName?: string | undefined;
|
|
22
21
|
fileType?: "all" | "image" | "audio" | undefined;
|
|
22
|
+
spaceName?: string | undefined;
|
|
23
23
|
}>;
|
|
24
24
|
readonly annotations: {
|
|
25
25
|
readonly title: "Space Files List";
|
package/package.json
CHANGED
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { listFiles } from '@huggingface/hub';
|
|
3
|
+
import { formatBytes, escapeMarkdown } from './utilities.js';
|
|
4
|
+
import { HfApiError } from './hf-api-call.js';
|
|
5
|
+
import { explain } from './error-messages.js';
|
|
6
|
+
|
|
7
|
+
// Define the FileWithUrl interface
|
|
8
|
+
interface FileWithUrl {
|
|
9
|
+
path: string;
|
|
10
|
+
size: number;
|
|
11
|
+
type: 'file' | 'directory' | 'unknown';
|
|
12
|
+
url: string;
|
|
13
|
+
sizeFormatted: string;
|
|
14
|
+
lastModified?: string;
|
|
15
|
+
lfs: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// File type detection helpers
|
|
19
|
+
const IMAGE_EXTENSIONS = new Set([
|
|
20
|
+
'.jpg',
|
|
21
|
+
'.jpeg',
|
|
22
|
+
'.png',
|
|
23
|
+
'.gif',
|
|
24
|
+
'.bmp',
|
|
25
|
+
'.tiff',
|
|
26
|
+
'.tif',
|
|
27
|
+
'.webp',
|
|
28
|
+
'.svg',
|
|
29
|
+
'.ico',
|
|
30
|
+
'.heic',
|
|
31
|
+
'.heif',
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
const AUDIO_EXTENSIONS = new Set([
|
|
35
|
+
'.mp3',
|
|
36
|
+
'.wav',
|
|
37
|
+
'.flac',
|
|
38
|
+
'.aac',
|
|
39
|
+
'.ogg',
|
|
40
|
+
'.m4a',
|
|
41
|
+
'.wma',
|
|
42
|
+
'.opus',
|
|
43
|
+
'.aiff',
|
|
44
|
+
'.au',
|
|
45
|
+
'.ra',
|
|
46
|
+
]);
|
|
47
|
+
|
|
48
|
+
const TEXT_EXTENSIONS = new Set([
|
|
49
|
+
'.txt',
|
|
50
|
+
'.md',
|
|
51
|
+
'json',
|
|
52
|
+
'xml',
|
|
53
|
+
'.csv',
|
|
54
|
+
'.tsv',
|
|
55
|
+
'yaml',
|
|
56
|
+
'.yml',
|
|
57
|
+
'.html',
|
|
58
|
+
'.css',
|
|
59
|
+
'.js',
|
|
60
|
+
'.py',
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
function getFileExtension(path: string): string {
|
|
64
|
+
const lastDot = path.lastIndexOf('.');
|
|
65
|
+
return lastDot === -1 ? '' : path.substring(lastDot).toLowerCase();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function isImageFile(path: string): boolean {
|
|
69
|
+
return IMAGE_EXTENSIONS.has(getFileExtension(path));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function isAudioFile(path: string): boolean {
|
|
73
|
+
return AUDIO_EXTENSIONS.has(getFileExtension(path));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function isTextFile(path: string): boolean {
|
|
77
|
+
return TEXT_EXTENSIONS.has(getFileExtension(path));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function matchesFileType(file: FileWithUrl, fileType: 'all' | 'image' | 'audio' | 'text'): boolean {
|
|
81
|
+
switch (fileType) {
|
|
82
|
+
case 'all':
|
|
83
|
+
return true;
|
|
84
|
+
case 'image':
|
|
85
|
+
return isImageFile(file.path);
|
|
86
|
+
case 'audio':
|
|
87
|
+
return isAudioFile(file.path);
|
|
88
|
+
case 'text':
|
|
89
|
+
return isTextFile(file.path);
|
|
90
|
+
default:
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Tool configuration
|
|
96
|
+
export const GRADIO_FILES_TOOL_CONFIG = {
|
|
97
|
+
name: 'gradio_files',
|
|
98
|
+
description:
|
|
99
|
+
'List available URLs that can be used for Gradio File Inputs. Use when an input is requested and an explicit URL has not been provided.', // This will be dynamically set with username
|
|
100
|
+
schema: z.object({
|
|
101
|
+
fileType: z.enum(['all', 'image', 'audio', 'text']).optional().default('all').describe('Filter by type'),
|
|
102
|
+
}),
|
|
103
|
+
annotations: {
|
|
104
|
+
title: 'Gradio Files List',
|
|
105
|
+
destructiveHint: false,
|
|
106
|
+
readOnlyHint: true,
|
|
107
|
+
openWorldHint: true,
|
|
108
|
+
},
|
|
109
|
+
} as const;
|
|
110
|
+
|
|
111
|
+
export const GRADIO_FILES_PROMPT_CONFIG = {
|
|
112
|
+
name: 'Available Gradio Input Files',
|
|
113
|
+
description: 'Returns a list of files and their URLs to use as Gradio File Inputs.',
|
|
114
|
+
schema: z.object({}),
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// Define parameter types
|
|
118
|
+
export type GradioFilesParams = z.infer<typeof GRADIO_FILES_TOOL_CONFIG.schema>;
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Service for listing files in Hugging Face Spaces
|
|
122
|
+
*/
|
|
123
|
+
export class GradioFilesTool {
|
|
124
|
+
private readonly accessToken: string;
|
|
125
|
+
private readonly datasetname: string;
|
|
126
|
+
|
|
127
|
+
constructor(hfToken: string, username: string) {
|
|
128
|
+
this.accessToken = hfToken;
|
|
129
|
+
this.datasetname = `${username}/gradio-files`;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Get all files in a space with their URLs
|
|
134
|
+
*/
|
|
135
|
+
async getGradioFiles(): Promise<FileWithUrl[]> {
|
|
136
|
+
try {
|
|
137
|
+
const files: FileWithUrl[] = [];
|
|
138
|
+
|
|
139
|
+
// List all files recursively
|
|
140
|
+
for await (const file of listFiles({
|
|
141
|
+
repo: { type: 'dataset', name: this.datasetname },
|
|
142
|
+
recursive: false, // root directory only for now,
|
|
143
|
+
expand: true, // Get last commit info
|
|
144
|
+
...(this.accessToken && { credentials: { accessToken: this.accessToken } }),
|
|
145
|
+
})) {
|
|
146
|
+
if (file.type === 'file') {
|
|
147
|
+
// Exclude .gitattributes and .gitignore files
|
|
148
|
+
const fileName = file.path.split('/').pop() || file.path;
|
|
149
|
+
if (fileName === '.gitattributes' || fileName === '.gitignore') {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
files.push({
|
|
154
|
+
path: file.path,
|
|
155
|
+
size: file.size,
|
|
156
|
+
type: file.type,
|
|
157
|
+
url: this.constructFileUrl(file.path),
|
|
158
|
+
sizeFormatted: formatBytes(file.size),
|
|
159
|
+
lastModified: file.lastCommit?.date,
|
|
160
|
+
lfs: !!file.lfs,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return files.sort((a, b) => a.path.localeCompare(b.path));
|
|
166
|
+
} catch (error) {
|
|
167
|
+
if (error instanceof HfApiError) {
|
|
168
|
+
throw explain(error, `Failed to list files for dataset "${this.datasetname}"`);
|
|
169
|
+
}
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Construct the URL for a file
|
|
176
|
+
*/
|
|
177
|
+
private constructFileUrl(filePath: string): string {
|
|
178
|
+
return `https://huggingface.co/datasets/${this.datasetname}/resolve/main/${filePath}`;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Generate detailed markdown report with files grouped by directory
|
|
183
|
+
*/
|
|
184
|
+
async generateDetailedMarkdown(fileType: 'all' | 'image' | 'audio' | 'text' = 'all'): Promise<string> {
|
|
185
|
+
const allFiles = await this.getGradioFiles();
|
|
186
|
+
const files = allFiles.filter((file) => matchesFileType(file, fileType));
|
|
187
|
+
|
|
188
|
+
let markdown = `# Available Gradio Input files in : ${this.datasetname}\n\n`;
|
|
189
|
+
if (fileType !== 'all') {
|
|
190
|
+
markdown += `**Filter**: ${fileType} files only\n`;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Handle empty results
|
|
194
|
+
if (files.length === 0) {
|
|
195
|
+
if (fileType !== 'all') {
|
|
196
|
+
markdown += `No ${fileType} files found in this space.\n`;
|
|
197
|
+
} else {
|
|
198
|
+
markdown += `No files found in this space.\n`;
|
|
199
|
+
}
|
|
200
|
+
return markdown;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Generate table
|
|
204
|
+
markdown += `## All Files\n\n`;
|
|
205
|
+
markdown += `| Name | Size | Type | Last Modified | Gradio File Input |\n`;
|
|
206
|
+
markdown += `|------|------|------|---------------|-----|\n`;
|
|
207
|
+
|
|
208
|
+
for (const file of files) {
|
|
209
|
+
const fileName = file.path.split('/').pop() || file.path;
|
|
210
|
+
const icon = this.getFileIcon(fileName);
|
|
211
|
+
const lastMod = file.lastModified ? new Date(file.lastModified).toLocaleDateString() : '-';
|
|
212
|
+
|
|
213
|
+
markdown += `| ${escapeMarkdown(fileName)} | ${file.sizeFormatted} | ${icon} ${file.type} | ${lastMod} | ${file.url} |\n`;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return markdown;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Get file icon based on extension
|
|
221
|
+
*/
|
|
222
|
+
private getFileIcon(filename: string): string {
|
|
223
|
+
const ext = filename.split('.').pop()?.toLowerCase();
|
|
224
|
+
const iconMap: Record<string, string> = {
|
|
225
|
+
py: '🐍',
|
|
226
|
+
js: '📜',
|
|
227
|
+
ts: '📘',
|
|
228
|
+
md: '📝',
|
|
229
|
+
txt: '📄',
|
|
230
|
+
json: '📊',
|
|
231
|
+
yaml: '⚙️',
|
|
232
|
+
yml: '⚙️',
|
|
233
|
+
png: '🖼️',
|
|
234
|
+
jpg: '🖼️',
|
|
235
|
+
jpeg: '🖼️',
|
|
236
|
+
gif: '🖼️',
|
|
237
|
+
svg: '🎨',
|
|
238
|
+
mp4: '🎬',
|
|
239
|
+
mp3: '🎵',
|
|
240
|
+
pdf: '📕',
|
|
241
|
+
zip: '📦',
|
|
242
|
+
tar: '📦',
|
|
243
|
+
gz: '📦',
|
|
244
|
+
html: '🌐',
|
|
245
|
+
css: '🎨',
|
|
246
|
+
ipynb: '📓',
|
|
247
|
+
csv: '📊',
|
|
248
|
+
parquet: '🗄️',
|
|
249
|
+
safetensors: '🤖',
|
|
250
|
+
bin: '💾',
|
|
251
|
+
pkl: '🥒',
|
|
252
|
+
h5: '🗃️',
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
return iconMap[ext || ''] || '📄';
|
|
256
|
+
}
|
|
257
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,7 @@ export * from './dataset-detail.js';
|
|
|
11
11
|
export * from './duplicate-space.js';
|
|
12
12
|
export * from './space-info.js';
|
|
13
13
|
export * from './space-files.js';
|
|
14
|
+
export * from './gradio-files.js';
|
|
14
15
|
export * from './user-summary.js';
|
|
15
16
|
export * from './paper-summary.js';
|
|
16
17
|
export * from './docs-search/docs-semantic-search.js';
|