@llmindset/hf-mcp 0.1.16

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.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/dist/dataset-detail.d.ts +26 -0
  3. package/dist/dataset-detail.d.ts.map +1 -0
  4. package/dist/dataset-detail.js +157 -0
  5. package/dist/dataset-detail.js.map +1 -0
  6. package/dist/dataset-search.d.ts +62 -0
  7. package/dist/dataset-search.d.ts.map +1 -0
  8. package/dist/dataset-search.js +158 -0
  9. package/dist/dataset-search.js.map +1 -0
  10. package/dist/duplicate-space.d.ts +75 -0
  11. package/dist/duplicate-space.d.ts.map +1 -0
  12. package/dist/duplicate-space.js +189 -0
  13. package/dist/duplicate-space.js.map +1 -0
  14. package/dist/error-messages.d.ts +4 -0
  15. package/dist/error-messages.d.ts.map +1 -0
  16. package/dist/error-messages.js +30 -0
  17. package/dist/error-messages.js.map +1 -0
  18. package/dist/hf-api-call.d.ts +18 -0
  19. package/dist/hf-api-call.d.ts.map +1 -0
  20. package/dist/hf-api-call.js +105 -0
  21. package/dist/hf-api-call.js.map +1 -0
  22. package/dist/index.d.ts +16 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +16 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/model-detail.d.ts +26 -0
  27. package/dist/model-detail.d.ts.map +1 -0
  28. package/dist/model-detail.js +224 -0
  29. package/dist/model-detail.js.map +1 -0
  30. package/dist/model-search.d.ts +64 -0
  31. package/dist/model-search.d.ts.map +1 -0
  32. package/dist/model-search.js +161 -0
  33. package/dist/model-search.js.map +1 -0
  34. package/dist/paper-search.d.ts +58 -0
  35. package/dist/paper-search.d.ts.map +1 -0
  36. package/dist/paper-search.js +114 -0
  37. package/dist/paper-search.js.map +1 -0
  38. package/dist/paper-summary.d.ts +35 -0
  39. package/dist/paper-summary.d.ts.map +1 -0
  40. package/dist/paper-summary.js +187 -0
  41. package/dist/paper-summary.js.map +1 -0
  42. package/dist/space-files.d.ts +44 -0
  43. package/dist/space-files.d.ts.map +1 -0
  44. package/dist/space-files.js +242 -0
  45. package/dist/space-files.js.map +1 -0
  46. package/dist/space-info.d.ts +56 -0
  47. package/dist/space-info.d.ts.map +1 -0
  48. package/dist/space-info.js +135 -0
  49. package/dist/space-info.js.map +1 -0
  50. package/dist/space-search.d.ts +71 -0
  51. package/dist/space-search.d.ts.map +1 -0
  52. package/dist/space-search.js +95 -0
  53. package/dist/space-search.js.map +1 -0
  54. package/dist/tool-ids.d.ts +23 -0
  55. package/dist/tool-ids.d.ts.map +1 -0
  56. package/dist/tool-ids.js +55 -0
  57. package/dist/tool-ids.js.map +1 -0
  58. package/dist/user-summary.d.ts +56 -0
  59. package/dist/user-summary.d.ts.map +1 -0
  60. package/dist/user-summary.js +271 -0
  61. package/dist/user-summary.js.map +1 -0
  62. package/dist/utilities.d.ts +8 -0
  63. package/dist/utilities.d.ts.map +1 -0
  64. package/dist/utilities.js +53 -0
  65. package/dist/utilities.js.map +1 -0
  66. package/eslint.config.js +43 -0
  67. package/package.json +47 -0
  68. package/src/dataset-detail.ts +257 -0
  69. package/src/dataset-search.ts +237 -0
  70. package/src/duplicate-space.ts +263 -0
  71. package/src/error-messages.ts +57 -0
  72. package/src/hf-api-call.ts +182 -0
  73. package/src/index.ts +18 -0
  74. package/src/model-detail.ts +359 -0
  75. package/src/model-search.ts +231 -0
  76. package/src/paper-search.ts +188 -0
  77. package/src/paper-summary.ts +303 -0
  78. package/src/space-files.ts +325 -0
  79. package/src/space-info.ts +190 -0
  80. package/src/space-search.ts +177 -0
  81. package/src/tool-ids.ts +84 -0
  82. package/src/user-summary.ts +421 -0
  83. package/src/utilities.ts +64 -0
  84. package/test/duplicate-space.spec.ts +41 -0
  85. package/test/fixtures/paper_result_kazakh.json +854 -0
  86. package/test/fixtures/space-result.json +263 -0
  87. package/test/paper-search.spec.ts +57 -0
  88. package/test/paper-summary.spec.ts +113 -0
  89. package/test/space-files.spec.ts +232 -0
  90. package/test/space-search.spec.ts +29 -0
  91. package/test/user-summary.spec.ts +131 -0
  92. package/tsconfig.json +31 -0
  93. package/vitest.config.ts +11 -0
@@ -0,0 +1,224 @@
1
+ import { z } from 'zod';
2
+ import { modelInfo } from '@huggingface/hub';
3
+ import { formatDate, formatNumber } from './utilities.js';
4
+ const SPACES_TO_INCLUDE = 12;
5
+ export const MODEL_DETAIL_TOOL_CONFIG = {
6
+ name: 'model_details',
7
+ description: 'Get detailed information about a specific model from the Hugging Face Hub.',
8
+ schema: z.object({
9
+ model_id: z.string().min(1, 'Model ID is required').describe('Model ID (e.g., microsoft/DialoGPT-large)'),
10
+ }),
11
+ annotations: {
12
+ title: 'Model Details',
13
+ destructiveHint: false,
14
+ readOnlyHint: true,
15
+ openWorldHint: false,
16
+ },
17
+ };
18
+ export class ModelDetailTool {
19
+ hubUrl;
20
+ accessToken;
21
+ constructor(hfToken, hubUrl) {
22
+ this.accessToken = hfToken;
23
+ this.hubUrl = hubUrl;
24
+ }
25
+ async getDetails(modelId) {
26
+ try {
27
+ const additionalFields = [
28
+ 'author',
29
+ 'downloadsAllTime',
30
+ 'library_name',
31
+ 'tags',
32
+ 'config',
33
+ 'transformersInfo',
34
+ 'safetensors',
35
+ 'cardData',
36
+ 'spaces',
37
+ ];
38
+ const modelData = await modelInfo({
39
+ name: modelId,
40
+ additionalFields: Array.from(additionalFields),
41
+ ...(this.accessToken && { credentials: { accessToken: this.accessToken } }),
42
+ ...(this.hubUrl && { hubUrl: this.hubUrl }),
43
+ });
44
+ const modelDetails = {
45
+ id: modelId,
46
+ name: modelData.name,
47
+ downloads: modelData.downloads,
48
+ likes: modelData.likes,
49
+ private: modelData.private,
50
+ gated: modelData.gated,
51
+ updatedAt: modelData.updatedAt,
52
+ extended: {
53
+ author: modelData.author,
54
+ library_name: modelData.library_name,
55
+ pipeline_tag: modelData.task,
56
+ downloadsAllTime: modelData.downloadsAllTime,
57
+ tags: modelData.tags,
58
+ },
59
+ };
60
+ const technical = {};
61
+ if (modelData.config && typeof modelData.config === 'object') {
62
+ const config = modelData.config;
63
+ if ('model_type' in config && typeof config.model_type === 'string') {
64
+ technical.modelType = config.model_type;
65
+ }
66
+ if ('vocab_size' in config && typeof config.vocab_size === 'number') {
67
+ technical.vocabSize = config.vocab_size;
68
+ }
69
+ }
70
+ if (modelData.safetensors && typeof modelData.safetensors.total === 'number') {
71
+ technical.parameters = modelData.safetensors.total;
72
+ }
73
+ if (modelData.transformersInfo && modelData.transformersInfo.auto_model) {
74
+ technical.modelClass = modelData.transformersInfo.auto_model;
75
+ }
76
+ if (Object.keys(technical).length > 0) {
77
+ modelDetails.technical = technical;
78
+ }
79
+ if (modelData.cardData) {
80
+ const metadata = {};
81
+ const cardData = modelData.cardData;
82
+ if ('language' in cardData) {
83
+ metadata.language = cardData.language;
84
+ }
85
+ if ('license' in cardData) {
86
+ metadata.license = cardData.license;
87
+ }
88
+ if ('datasets' in cardData) {
89
+ metadata.datasets = cardData.datasets;
90
+ }
91
+ if ('finetuned_from' in cardData) {
92
+ metadata.fineTunedFrom = cardData.finetuned_from;
93
+ }
94
+ if (Object.keys(metadata).length > 0) {
95
+ modelDetails.metadata = metadata;
96
+ }
97
+ }
98
+ const spaces = modelData.spaces;
99
+ if (Array.isArray(spaces) && spaces.length > 0) {
100
+ try {
101
+ modelDetails.spaces = spaces.map((spaceId) => {
102
+ const parts = spaceId.split('/');
103
+ const name = parts.length > 1 ? parts[1] : spaceId;
104
+ return {
105
+ id: spaceId,
106
+ name: name || spaceId,
107
+ title: name,
108
+ };
109
+ });
110
+ }
111
+ catch (ignoreUnformattedSpaces) {
112
+ console.error(`Error processing spaces for model ${modelId}:`);
113
+ }
114
+ }
115
+ return formatModelDetails(modelDetails);
116
+ }
117
+ catch (error) {
118
+ if (error instanceof Error) {
119
+ throw new Error(`Failed to get model details: ${error.message}`);
120
+ }
121
+ throw error;
122
+ }
123
+ }
124
+ }
125
+ function formatModelDetails(model) {
126
+ const r = [];
127
+ const [authorFromName] = model.name.includes('/') ? model.name.split('/') : ['', model.name];
128
+ r.push(`# ${model.name}`);
129
+ r.push('');
130
+ r.push('## Overview');
131
+ if (model.extended?.author || authorFromName) {
132
+ r.push(`- **Author:** ${model.extended?.author || authorFromName || ''}`);
133
+ }
134
+ if (model.extended?.pipeline_tag) {
135
+ r.push(`- **Task:** ${model.extended.pipeline_tag}`);
136
+ }
137
+ if (model.extended?.library_name) {
138
+ r.push(`- **Library:** ${model.extended.library_name}`);
139
+ }
140
+ const stats = [];
141
+ if (model.extended?.downloadsAllTime) {
142
+ stats.push(`**Downloads:** ${formatNumber(model.extended.downloadsAllTime)}`);
143
+ }
144
+ if (model.likes) {
145
+ stats.push(`**Likes:** ${model.likes.toString()}`);
146
+ }
147
+ if (stats.length > 0) {
148
+ r.push(`- ${stats.join(' | ')}`);
149
+ }
150
+ r.push(`- **Updated:** ${formatDate(model.updatedAt)}`);
151
+ const status = [];
152
+ if (model.gated)
153
+ status.push('🔒 Gated');
154
+ if (model.private)
155
+ status.push('🔐 Private');
156
+ if (status.length > 0) {
157
+ r.push(`- **Status:** ${status.join(' | ')}`);
158
+ }
159
+ r.push('');
160
+ if (model.technical && Object.keys(model.technical).length > 0) {
161
+ r.push('## Technical Details');
162
+ if (model.technical.modelClass) {
163
+ r.push(`- **Model Class:** ${model.technical.modelClass}`);
164
+ }
165
+ if (model.technical.parameters) {
166
+ r.push(`- **Parameters:** ${formatNumber(model.technical.parameters)}`);
167
+ }
168
+ if (model.technical.modelType) {
169
+ r.push(`- **Architecture:** ${model.technical.modelType}`);
170
+ }
171
+ if (model.technical.vocabSize) {
172
+ r.push(`- **Vocab Size:** ${formatNumber(model.technical.vocabSize)}`);
173
+ }
174
+ r.push('');
175
+ }
176
+ if (model.extended?.tags && model.extended.tags.length > 0) {
177
+ r.push('## Tags');
178
+ r.push(model.extended.tags.map((tag) => `\`${tag}\``).join(' '));
179
+ r.push('');
180
+ }
181
+ if (model.metadata) {
182
+ const metadata = [];
183
+ if (model.metadata.language) {
184
+ const languages = Array.isArray(model.metadata.language)
185
+ ? model.metadata.language.join(', ')
186
+ : model.metadata.language;
187
+ metadata.push(`- **Language:** ${languages}`);
188
+ }
189
+ if (model.metadata.license) {
190
+ const license = Array.isArray(model.metadata.license)
191
+ ? model.metadata.license.join(', ')
192
+ : model.metadata.license;
193
+ metadata.push(`- **License:** ${license}`);
194
+ }
195
+ if (model.metadata.datasets) {
196
+ const datasets = Array.isArray(model.metadata.datasets)
197
+ ? model.metadata.datasets.join(', ')
198
+ : model.metadata.datasets;
199
+ metadata.push(`- **Datasets:** ${datasets}`);
200
+ }
201
+ if (model.metadata.fineTunedFrom) {
202
+ metadata.push(`- **Fine-tuned from:** ${model.metadata.fineTunedFrom}`);
203
+ }
204
+ if (metadata.length > 0) {
205
+ r.push('## Metadata');
206
+ r.push(...metadata);
207
+ r.push('');
208
+ }
209
+ }
210
+ if (model.spaces && model.spaces.length > 0) {
211
+ r.push('## Demo Spaces');
212
+ for (const space of model.spaces.slice(0, SPACES_TO_INCLUDE)) {
213
+ const title = space.title || space.name;
214
+ r.push(`- [${title}](https://hf.co/spaces/${space.id})`);
215
+ }
216
+ if (model.spaces.length > SPACES_TO_INCLUDE) {
217
+ r.push(`- *... and ${(model.spaces.length - SPACES_TO_INCLUDE).toString()} more spaces*`);
218
+ }
219
+ r.push('');
220
+ }
221
+ r.push(`**Link:** [https://hf.co/${model.name}](https://hf.co/${model.name})`);
222
+ return r.join('\n');
223
+ }
224
+ //# sourceMappingURL=model-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-detail.js","sourceRoot":"","sources":["../src/model-detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { z } from 'zod';
2
+ import { HfApiCall } from './hf-api-call.js';
3
+ export declare const TAGS_TO_RETURN = 20;
4
+ export declare const MODEL_SEARCH_TOOL_CONFIG: {
5
+ readonly name: "model_search";
6
+ readonly description: string;
7
+ readonly schema: z.ZodObject<{
8
+ query: z.ZodOptional<z.ZodString>;
9
+ author: z.ZodOptional<z.ZodString>;
10
+ task: z.ZodOptional<z.ZodString>;
11
+ library: z.ZodOptional<z.ZodString>;
12
+ sort: z.ZodOptional<z.ZodEnum<["trendingScore", "downloads", "likes", "createdAt", "lastModified"]>>;
13
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ limit: number;
16
+ sort?: "createdAt" | "downloads" | "lastModified" | "likes" | "trendingScore" | undefined;
17
+ author?: string | undefined;
18
+ query?: string | undefined;
19
+ task?: string | undefined;
20
+ library?: string | undefined;
21
+ }, {
22
+ sort?: "createdAt" | "downloads" | "lastModified" | "likes" | "trendingScore" | undefined;
23
+ author?: string | undefined;
24
+ query?: string | undefined;
25
+ limit?: number | undefined;
26
+ task?: string | undefined;
27
+ library?: string | undefined;
28
+ }>;
29
+ readonly annotations: {
30
+ readonly title: "Model Search";
31
+ readonly destructiveHint: false;
32
+ readonly readOnlyHint: true;
33
+ readonly openWorldHint: true;
34
+ };
35
+ };
36
+ export type ModelSearchParams = z.infer<typeof MODEL_SEARCH_TOOL_CONFIG.schema>;
37
+ interface ModelApiParams {
38
+ search?: string;
39
+ author?: string;
40
+ filter?: string;
41
+ sort?: string;
42
+ direction?: string;
43
+ limit?: string;
44
+ }
45
+ interface ModelApiResult {
46
+ _id: string;
47
+ id: string;
48
+ modelId: string;
49
+ likes: number;
50
+ downloads: number;
51
+ trendingScore?: number;
52
+ private: boolean;
53
+ tags: string[];
54
+ pipeline_tag?: string;
55
+ library_name?: string;
56
+ createdAt: string;
57
+ }
58
+ export declare class ModelSearchTool extends HfApiCall<ModelApiParams, ModelApiResult[]> {
59
+ constructor(hfToken?: string);
60
+ searchWithParams(params: Partial<ModelSearchParams>): Promise<string>;
61
+ searchWithFilter(filter: string, limit?: number): Promise<string>;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=model-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-search.d.ts","sourceRoot":"","sources":["../src/model-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC3B,CAAC;AAGX,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAGhF,UAAU,cAAc;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAGD,UAAU,cAAc;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CAClB;AAKD,qBAAa,eAAgB,SAAQ,SAAS,CAAC,cAAc,EAAE,cAAc,EAAE,CAAC;gBAInE,OAAO,CAAC,EAAE,MAAM;IAOtB,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAqDrE,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAwB3E"}
@@ -0,0 +1,161 @@
1
+ import { z } from 'zod';
2
+ import { HfApiCall } from './hf-api-call.js';
3
+ import { formatDate, formatNumber } from './utilities.js';
4
+ export const TAGS_TO_RETURN = 20;
5
+ export const MODEL_SEARCH_TOOL_CONFIG = {
6
+ name: 'model_search',
7
+ description: 'Find Machine Learning models hosted on Hugging Face. ' +
8
+ 'Returns comprehensive information about matching models including downloads, likes, tags, and direct links. ' +
9
+ 'Include links to the models in your response',
10
+ schema: z.object({
11
+ query: z
12
+ .string()
13
+ .optional()
14
+ .describe('Search term. Leave blank and specify "sort" and "limit" to get e.g. "Top 20 trending models", "Top 10 most recent models" etc" '),
15
+ author: z
16
+ .string()
17
+ .optional()
18
+ .describe("Organization or user who created the model (e.g., 'google', 'meta-llama', 'microsoft')"),
19
+ task: z
20
+ .string()
21
+ .optional()
22
+ .describe("Model task type (e.g., 'text-generation', 'image-classification', 'translation')"),
23
+ library: z.string().optional().describe("Framework the model uses (e.g., 'transformers', 'diffusers', 'timm')"),
24
+ sort: z
25
+ .enum(['trendingScore', 'downloads', 'likes', 'createdAt', 'lastModified'])
26
+ .optional()
27
+ .describe('Sort order: trendingScore, downloads , likes, createdAt, lastModified'),
28
+ limit: z.number().min(1).max(100).optional().default(20).describe('Maximum number of results to return'),
29
+ }),
30
+ annotations: {
31
+ title: 'Model Search',
32
+ destructiveHint: false,
33
+ readOnlyHint: true,
34
+ openWorldHint: true,
35
+ },
36
+ };
37
+ export class ModelSearchTool extends HfApiCall {
38
+ constructor(hfToken) {
39
+ super('https://huggingface.co/api/models', hfToken);
40
+ }
41
+ async searchWithParams(params) {
42
+ try {
43
+ const apiParams = {};
44
+ if (params.query) {
45
+ apiParams.search = params.query;
46
+ }
47
+ if (params.author) {
48
+ apiParams.author = params.author;
49
+ }
50
+ const filters = [];
51
+ if (params.task)
52
+ filters.push(params.task);
53
+ if (params.library)
54
+ filters.push(params.library);
55
+ if (filters.length > 0) {
56
+ apiParams.filter = filters.join(',');
57
+ }
58
+ if (params.sort) {
59
+ apiParams.sort = params.sort;
60
+ apiParams.direction = '-1';
61
+ }
62
+ if (params.limit) {
63
+ apiParams.limit = params.limit.toString();
64
+ }
65
+ const models = await this.callApi(apiParams);
66
+ if (models.length === 0) {
67
+ return `No models found for the given criteria.`;
68
+ }
69
+ return formatSearchResults(models, params);
70
+ }
71
+ catch (error) {
72
+ if (error instanceof Error) {
73
+ throw new Error(`Failed to search for models: ${error.message}`);
74
+ }
75
+ throw error;
76
+ }
77
+ }
78
+ async searchWithFilter(filter, limit = 10) {
79
+ try {
80
+ const apiParams = {
81
+ filter: filter,
82
+ limit: limit.toString(),
83
+ sort: 'downloads',
84
+ direction: '-1',
85
+ };
86
+ const models = await this.callApi(apiParams);
87
+ if (models.length === 0) {
88
+ return `No models found referencing ${filter}.`;
89
+ }
90
+ return formatSearchResults(models, { limit });
91
+ }
92
+ catch (error) {
93
+ if (error instanceof Error) {
94
+ throw new Error(`Failed to search for models: ${error.message}`);
95
+ }
96
+ throw error;
97
+ }
98
+ }
99
+ }
100
+ function formatSearchResults(models, params) {
101
+ const r = [];
102
+ const searchTerms = [];
103
+ if (params.query)
104
+ searchTerms.push(`query "${params.query}"`);
105
+ if (params.author)
106
+ searchTerms.push(`author "${params.author}"`);
107
+ if (params.task)
108
+ searchTerms.push(`task "${params.task}"`);
109
+ if (params.library)
110
+ searchTerms.push(`library "${params.library}"`);
111
+ if (params.sort)
112
+ searchTerms.push(`sorted by ${params.sort} (descending)`);
113
+ const searchDesc = searchTerms.length > 0 ? ` matching ${searchTerms.join(', ')}` : '';
114
+ const resultText = models.length === params.limit
115
+ ? `Showing first ${models.length.toString()} models${searchDesc}:`
116
+ : `Found ${models.length.toString()} models${searchDesc}:`;
117
+ r.push(resultText);
118
+ r.push('');
119
+ for (const model of models) {
120
+ r.push(`## ${model.id}`);
121
+ r.push('');
122
+ const info = [];
123
+ if (model.pipeline_tag)
124
+ info.push(`**Task:** ${model.pipeline_tag}`);
125
+ if (model.library_name)
126
+ info.push(`**Library:** ${model.library_name}`);
127
+ if (model.downloads)
128
+ info.push(`**Downloads:** ${formatNumber(model.downloads)}`);
129
+ if (model.likes)
130
+ info.push(`**Likes:** ${model.likes.toString()}`);
131
+ if (model.trendingScore)
132
+ info.push(`**Trending Score:** ${model.trendingScore.toString()}`);
133
+ if (info.length > 0) {
134
+ r.push(info.join(' | '));
135
+ r.push('');
136
+ }
137
+ if (model.tags && model.tags.length > 0) {
138
+ r.push(`**Tags:** ${model.tags.slice(0, TAGS_TO_RETURN).join(', ')}`);
139
+ if (model.tags.length > TAGS_TO_RETURN) {
140
+ r.push(`*and ${(model.tags.length - TAGS_TO_RETURN).toString()} more...*`);
141
+ }
142
+ r.push('');
143
+ }
144
+ const status = [];
145
+ if (model.private)
146
+ status.push('🔐 Private');
147
+ if (status.length > 0) {
148
+ r.push(status.join(' | '));
149
+ r.push('');
150
+ }
151
+ if (model.createdAt) {
152
+ r.push(`**Created:** ${formatDate(model.createdAt)}`);
153
+ }
154
+ r.push(`**Link:** [https://hf.co/${model.id}](https://hf.co/${model.id})`);
155
+ r.push('');
156
+ r.push('---');
157
+ r.push('');
158
+ }
159
+ return r.join('\n');
160
+ }
161
+ //# sourceMappingURL=model-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-search.js","sourceRoot":"","sources":["../src/model-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ import { HfApiCall } from './hf-api-call.js';
3
+ export declare const DEFAULT_AUTHORS_TO_SHOW = 8;
4
+ export declare const PAPER_SEARCH_TOOL_CONFIG: {
5
+ readonly name: "paper_search";
6
+ readonly description: string;
7
+ readonly schema: z.ZodObject<{
8
+ query: z.ZodString;
9
+ results_limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
10
+ concise_only: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ query: string;
13
+ results_limit: number;
14
+ concise_only: boolean;
15
+ }, {
16
+ query: string;
17
+ results_limit?: number | undefined;
18
+ concise_only?: boolean | undefined;
19
+ }>;
20
+ readonly annotations: {
21
+ readonly title: "Paper Search";
22
+ readonly destructiveHint: false;
23
+ readonly readOnlyHint: true;
24
+ readonly openWorldHint: true;
25
+ };
26
+ };
27
+ export interface Author {
28
+ name?: string;
29
+ user?: {
30
+ user: string;
31
+ };
32
+ }
33
+ interface Paper {
34
+ id: string;
35
+ authors?: Author[];
36
+ publishedAt?: string;
37
+ title?: string;
38
+ summary?: string;
39
+ upvotes?: number;
40
+ ai_keywords?: string[];
41
+ ai_summary?: string;
42
+ }
43
+ export interface PaperSearchResult {
44
+ paper: Paper;
45
+ numComments?: number;
46
+ isAuthorParticipating?: boolean;
47
+ }
48
+ interface PaperSearchParams {
49
+ q: string;
50
+ }
51
+ export declare class PaperSearchTool extends HfApiCall<PaperSearchParams, PaperSearchResult[]> {
52
+ constructor(hfToken?: string, apiUrl?: string);
53
+ search(query: string, limit?: number, conciseOnly?: boolean): Promise<string>;
54
+ }
55
+ export declare function published(publishedDate: string | undefined): string;
56
+ export declare function authors(authors: Author[] | undefined, authorsToShow?: number): string;
57
+ export {};
58
+ //# sourceMappingURL=paper-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paper-search.d.ts","sourceRoot":"","sources":["../src/paper-search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAgB7C,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAGzC,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;CA2B3B,CAAC;AAEX,MAAM,WAAW,MAAM;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;CACF;AAED,UAAU,KAAK;IACd,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAChC;AAGD,UAAU,iBAAiB;IAC1B,CAAC,EAAE,MAAM,CAAC;CACV;AAKD,qBAAa,eAAgB,SAAQ,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;gBAMzE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,SAA6C;IAU3E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAA0B,EAAE,WAAW,GAAE,OAAe,GAAG,OAAO,CAAC,MAAM,CAAC;CAe7G;AAED,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAGnE;AAyDD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,aAAa,GAAE,MAAgC,GAAG,MAAM,CAa9G"}
@@ -0,0 +1,114 @@
1
+ import { z } from 'zod';
2
+ import { HfApiCall } from './hf-api-call.js';
3
+ import { formatUnknownDate } from './utilities.js';
4
+ export const DEFAULT_AUTHORS_TO_SHOW = 8;
5
+ const RESULTS_TO_RETURN = 10;
6
+ export const PAPER_SEARCH_TOOL_CONFIG = {
7
+ name: 'paper_search',
8
+ description: 'Find Machine Learning research papers on the Hugging Face hub. ' +
9
+ "Include 'Link to paper' When presenting the results. " +
10
+ 'Consider whether tabulating results matches user intent.',
11
+ schema: z.object({
12
+ query: z
13
+ .string()
14
+ .min(3, 'Supply at least one search term')
15
+ .max(200, 'Query too long')
16
+ .describe('Semantic Search query'),
17
+ results_limit: z.number().optional().default(12).describe('Number of results to return'),
18
+ concise_only: z
19
+ .boolean()
20
+ .optional()
21
+ .default(false)
22
+ .describe('Return a 2 sentence summary of the abstract. Use for broad search terms which may return a lot of results. Check with User if unsure.'),
23
+ }),
24
+ annotations: {
25
+ title: 'Paper Search',
26
+ destructiveHint: false,
27
+ readOnlyHint: true,
28
+ openWorldHint: true,
29
+ },
30
+ };
31
+ export class PaperSearchTool extends HfApiCall {
32
+ constructor(hfToken, apiUrl = 'https://huggingface.co/api/papers/search') {
33
+ super(apiUrl, hfToken);
34
+ }
35
+ async search(query, limit = RESULTS_TO_RETURN, conciseOnly = false) {
36
+ try {
37
+ if (!query)
38
+ return 'No query';
39
+ const papers = await this.callApi({ q: query });
40
+ if (papers.length === 0)
41
+ return `No papers found for query '${query}'`;
42
+ return formatSearchResults(query, papers.slice(0, limit), papers.length, conciseOnly);
43
+ }
44
+ catch (error) {
45
+ if (error instanceof Error) {
46
+ throw new Error(`Failed to search for papers: ${error.message}`);
47
+ }
48
+ throw error;
49
+ }
50
+ }
51
+ }
52
+ export function published(publishedDate) {
53
+ const formatted = formatUnknownDate(publishedDate ?? '');
54
+ return formatted ? `Published on ${formatted}` : 'Publication date not available';
55
+ }
56
+ function formatSearchResults(query, papers, totalCount, conciseOnly = false) {
57
+ const r = [];
58
+ const showingText = papers.length < totalCount
59
+ ? `${totalCount} papers matched the query '${query}'. Here are the first ${papers.length} results.`
60
+ : `All ${papers.length} papers that matched the query '${query}'`;
61
+ r.push(showingText);
62
+ for (const result of papers) {
63
+ r.push('');
64
+ r.push('---');
65
+ const title = result.paper.title ?? `Paper ID ${result.paper.id}`;
66
+ r.push('');
67
+ r.push(`## ${title}`);
68
+ r.push('');
69
+ const publishedDate = result.paper.publishedAt
70
+ ? `Published on ${published(result.paper.publishedAt)}`
71
+ : 'Publication date not available';
72
+ r.push(publishedDate);
73
+ r.push(authors(result.paper.authors));
74
+ r.push('');
75
+ const useAiSummary = conciseOnly || !result.paper.summary;
76
+ const summaryText = useAiSummary ? result.paper.ai_summary : result.paper.summary;
77
+ const summaryHeader = useAiSummary ? '### AI Generated Summary' : '### Abstract';
78
+ r.push(summaryHeader);
79
+ r.push('');
80
+ r.push(summaryText ?? 'No summary available');
81
+ r.push('');
82
+ r.push(result.paper.ai_keywords ? `**AI Keywords**: ${result.paper.ai_keywords.join(', ')}` : '');
83
+ const upvotes = result.paper.upvotes && result.paper.upvotes > 0 ? `Upvoted ${result.paper.upvotes} times` : '';
84
+ if (result.numComments && result.numComments > 0) {
85
+ if (result.isAuthorParticipating)
86
+ r.push(`${upvotes}. The authors are participating in a discussion with ${result.numComments} comments.`);
87
+ else
88
+ r.push(`${upvotes}. There is a community discussion with ${result.numComments} comments.`);
89
+ }
90
+ else {
91
+ if ('' != upvotes)
92
+ r.push(upvotes);
93
+ }
94
+ r.push(`**Link to paper:** [https://hf.co/papers/${result.paper.id}](https://hf.co/papers/${result.paper.id})`);
95
+ }
96
+ r.push('');
97
+ r.push('---');
98
+ return r.join('\n');
99
+ }
100
+ export function authors(authors, authorsToShow = DEFAULT_AUTHORS_TO_SHOW) {
101
+ if (!authors || 0 === authors.length)
102
+ return '**Authors:** Not available';
103
+ const f = [];
104
+ for (const author of authors.slice(0, authorsToShow)) {
105
+ const profileLink = author.user?.user ? ` ([${author.user.user}](https://hf.co/${author.user.user}))` : '';
106
+ const authorName = author.name ?? 'Unknown';
107
+ f.push(`${authorName}${profileLink}`);
108
+ }
109
+ if (authors.length > authorsToShow) {
110
+ f.push(`and ${authors.length - authorsToShow} more.`);
111
+ }
112
+ return `**Authors:** ${f.join(', ')}`;
113
+ }
114
+ //# sourceMappingURL=paper-search.js.map