@llmindset/hf-mcp 0.1.21 → 0.1.23
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 +9 -3
- package/dist/docs-search/doc-fetch.d.ts.map +1 -1
- package/dist/docs-search/doc-fetch.js +45 -20
- package/dist/docs-search/doc-fetch.js.map +1 -1
- package/dist/docs-search/doc-fetch.test.js +66 -40
- package/dist/docs-search/doc-fetch.test.js.map +1 -1
- package/dist/docs-search/docs-semantic-search.d.ts +3 -2
- package/dist/docs-search/docs-semantic-search.d.ts.map +1 -1
- package/dist/docs-search/docs-semantic-search.js +78 -32
- package/dist/docs-search/docs-semantic-search.js.map +1 -1
- package/dist/docs-search/docs-semantic-search.test.js +32 -0
- package/dist/docs-search/docs-semantic-search.test.js.map +1 -1
- package/dist/utilities.d.ts +1 -0
- package/dist/utilities.d.ts.map +1 -1
- package/dist/utilities.js +4 -0
- package/dist/utilities.js.map +1 -1
- package/package.json +3 -1
- package/src/docs-search/doc-fetch.test.ts +87 -56
- package/src/docs-search/doc-fetch.ts +70 -49
- package/src/docs-search/docs-semantic-search.test.ts +65 -0
- package/src/docs-search/docs-semantic-search.ts +120 -49
- package/src/utilities.ts +13 -0
- package/dist/docs-search/doc-mappings.d.ts +0 -7
- package/dist/docs-search/doc-mappings.d.ts.map +0 -1
- package/dist/docs-search/doc-mappings.js +0 -75
- package/dist/docs-search/doc-mappings.js.map +0 -1
- package/src/docs-search/doc-mappings.ts +0 -79
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-semantic-search.test.js","sourceRoot":"","sources":["../../src/docs-search/docs-semantic-search.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGlD,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,CAAC,KAAK,GAAG,SAAyB,CAAC;AAEzC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,IAAI,aAA4B,CAAC;IAEjC,UAAU,CAAC,GAAG,EAAE;QACf,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,EAAE,CAAC,aAAa,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC9E,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACrE,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACpF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,wDAAwD;oBAC9D,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,kFAAkF;oBACnG,iBAAiB,EAAE,0BAA0B;oBAC7C,QAAQ,EAAE,yBAAyB;iBACnC;gBACD;oBACC,IAAI,EAAE,sCAAsC;oBAC5C,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,kFAAkF;oBACnG,iBAAiB,EAAE,0BAA0B;oBAC7C,QAAQ,EAAE,gBAAgB;iBAC1B;gBACD;oBACC,IAAI,EAAE,2EAA2E;oBACjF,OAAO,EAAE,gBAAgB;oBACzB,QAAQ,EAAE,YAAY;oBACtB,eAAe,EAAE,mEAAmE;oBACpF,iBAAiB,EAAE,aAAa;iBAChC;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAGlE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wDAAwD,CAAC,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAG5C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAC/D,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;YACpF,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,kBAAkB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAG/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;YACpE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oDAAoD,CAAC,CAAC;YAG/E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CACvB,wFAAwF,CACxF,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uFAAuF,CAAC,CAAC;YAGlH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yDAAyD,CAAC,CAAC;YACpF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAC;YAG3E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wDAAwD,CAAC,CAAC;YACnF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2EAA2E,CAAC,CAAC;YAGtG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,GAAG,gBAAgB,CAAC,IAAI,GAAG,8CAA8C,CAAC,CAAC;QAChH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,wCAAwC;oBAC9C,OAAO,EAAE,cAAc;oBACvB,QAAQ,EAAE,cAAc;oBACxB,eAAe,EAAE,gDAAgD;oBACjE,iBAAiB,EAAE,cAAc;iBACjC;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC;YAGrE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,wDAAwD;oBAC9D,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,sBAAsB;oBAChC,eAAe,EAAE,sCAAsC;oBACvD,iBAAiB,EAAE,MAAM;oBACzB,QAAQ,EAAE,yBAAyB;iBACnC;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAGhE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YAEnD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yDAAyD,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,mFAAmF;oBACzF,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,2CAA2C;oBAC5D,iBAAiB,EAAE,WAAW;iBAC9B;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAG7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,aAAa,GAAG;gBAErB;oBACC,IAAI,EAAE,gCAAgC;oBACtC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,uCAAuC;oBACxD,iBAAiB,EAAE,QAAQ;iBAC3B;gBACD;oBACC,IAAI,EAAE,iCAAiC;oBACvC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,uCAAuC;oBACxD,iBAAiB,EAAE,QAAQ;iBAC3B;gBACD;oBACC,IAAI,EAAE,wBAAwB;oBAC9B,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,uCAAuC;oBACxD,iBAAiB,EAAE,QAAQ;iBAC3B;gBAED;oBACC,IAAI,EAAE,0BAA0B;oBAChC,OAAO,EAAE,cAAc;oBACvB,QAAQ,EAAE,mBAAmB;oBAC7B,eAAe,EAAE,gDAAgD;oBACjE,iBAAiB,EAAE,cAAc;iBACjC;gBAED;oBACC,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,UAAU;oBACnB,QAAQ,EAAE,eAAe;oBACzB,eAAe,EAAE,4CAA4C;oBAC7D,iBAAiB,EAAE,UAAU;iBAC7B;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAG7D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;YAC/D,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC;YACjF,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YAEzE,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAG7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;YAGpE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;YAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;YAC3E,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAG5C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8EAA8E,CAAC,CAAC;QAC1G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACxE,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAE9D,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACxF,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,oDAAoD;oBACrE,iBAAiB,EAAE,gBAAgB;oBACnC,QAAQ,EAAE,WAAW;iBACrB;gBACD;oBACC,IAAI,EAAE,8BAA8B;oBACpC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,oDAAoD;oBACrE,iBAAiB,EAAE,gBAAgB;oBACnC,QAAQ,EAAE,WAAW;iBACrB;gBACD;oBACC,IAAI,EAAE,6BAA6B;oBACnC,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,oDAAoD;oBACrE,iBAAiB,EAAE,gBAAgB;oBACnC,QAAQ,EAAE,WAAW;iBACrB;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAGlE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qFAAqF,CAAC,CAAC;YAGhH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YAGxD,MAAM,gBAAgB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YAC1E,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACpD,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YAE5D,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAC1G,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,aAAa,GAAG;gBACrB;oBACC,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,2BAA2B;oBAC5C,iBAAiB,EAAE,QAAQ;iBAC3B;gBACD;oBACC,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,2BAA2B;oBAC5C,iBAAiB,EAAE,QAAQ;iBAC3B;gBACD;oBACC,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,cAAc;oBACvB,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,2BAA2B;oBAC5C,iBAAiB,EAAE,QAAQ;iBAC3B;aACD,CAAC;YAEF,SAAS,CAAC,qBAAqB,CAAC;gBAC/B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC1C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAG7D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAC;YAGjE,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAGhD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAEhE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"docs-semantic-search.test.js","sourceRoot":"","sources":["../../src/docs-search/docs-semantic-search.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utilities.d.ts
CHANGED
|
@@ -5,4 +5,5 @@ export declare function formatUnknownDate(date: Date | string | undefined): stri
|
|
|
5
5
|
export declare function formatNumber(num: number): string;
|
|
6
6
|
export declare function formatBytes(bytes: number): string;
|
|
7
7
|
export declare function escapeMarkdown(text: string): string;
|
|
8
|
+
export declare function estimateTokens(text: string): number;
|
|
8
9
|
//# sourceMappingURL=utilities.d.ts.map
|
package/dist/utilities.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,QAE4E,CAAC;AAEzG,eAAO,MAAM,qBAAqB,QACsE,CAAC;AAGzG,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAGtD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUrF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASjD;AAOD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAanD"}
|
|
1
|
+
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,QAE4E,CAAC;AAEzG,eAAO,MAAM,qBAAqB,QACsE,CAAC;AAGzG,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAGtD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUrF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASjD;AAOD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAanD;AAWD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD"}
|
package/dist/utilities.js
CHANGED
|
@@ -50,4 +50,8 @@ export function escapeMarkdown(text) {
|
|
|
50
50
|
.replace(/>/g, '\\>')
|
|
51
51
|
.replace(/#/g, '\\#');
|
|
52
52
|
}
|
|
53
|
+
const CHARS_PER_TOKEN = 3.3;
|
|
54
|
+
export function estimateTokens(text) {
|
|
55
|
+
return Math.ceil(text.length / CHARS_PER_TOKEN);
|
|
56
|
+
}
|
|
53
57
|
//# sourceMappingURL=utilities.js.map
|
package/dist/utilities.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAC3B,2GAA2G;IAC3G,uGAAuG,CAAC;AAEzG,MAAM,CAAC,MAAM,qBAAqB,GACjC,qFAAqF,GAAG,eAAe,CAAC;AAGzG,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAA+B;IAChE,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEnC,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACvC,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACzC,CAAC;SAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACxC,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAChD,CAAC;SAAM,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7C,CAAC;SAAM,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACpC,CAAC;AAOD,MAAM,UAAU,cAAc,CAAC,IAAY;IAC1C,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAGrB,OAAO,IAAI;SACT,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC"}
|
|
1
|
+
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llmindset/hf-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.23",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -24,11 +24,13 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@huggingface/hub": "^2.1.0",
|
|
27
|
+
"turndown": "^7.2.0",
|
|
27
28
|
"zod": "^3.24.4"
|
|
28
29
|
},
|
|
29
30
|
"devDependencies": {
|
|
30
31
|
"@eslint/js": "^9.25.0",
|
|
31
32
|
"@types/node": "^22.15.18",
|
|
33
|
+
"@types/turndown": "^5.0.5",
|
|
32
34
|
"eslint": "^9.25.0",
|
|
33
35
|
"globals": "^16.0.0",
|
|
34
36
|
"rimraf": "^6.0.1",
|
|
@@ -1,74 +1,105 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
2
|
import { DocFetchTool } from './doc-fetch.js';
|
|
3
3
|
|
|
4
4
|
describe('DocFetchTool', () => {
|
|
5
5
|
const tool = new DocFetchTool();
|
|
6
6
|
|
|
7
|
-
describe('URL
|
|
8
|
-
it('should
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
'https://
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const result = tool.processUrl(hfUrl);
|
|
23
|
-
expect(result).toBe(expectedUrl);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it('should handle transformers documentation', () => {
|
|
27
|
-
const hfUrl = 'https://huggingface.co/docs/transformers/model_doc/bert';
|
|
28
|
-
const expectedUrl =
|
|
29
|
-
'https://raw.githubusercontent.com/huggingface/transformers/refs/heads/main/docs/source/en/model_doc/bert.md';
|
|
30
|
-
|
|
31
|
-
const result = tool.processUrl(hfUrl);
|
|
32
|
-
expect(result).toBe(expectedUrl);
|
|
7
|
+
describe('URL validation', () => {
|
|
8
|
+
it('should accept valid HF docs URLs', () => {
|
|
9
|
+
const validUrls = [
|
|
10
|
+
'https://huggingface.co/docs/dataset-viewer/index',
|
|
11
|
+
'https://huggingface.co/docs/huggingface_hub/guides/upload#faster-uploads',
|
|
12
|
+
'https://huggingface.co/docs/transformers/model_doc/bert',
|
|
13
|
+
'https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion',
|
|
14
|
+
'https://huggingface.co/docs/timm/models',
|
|
15
|
+
'https://huggingface.co/docs/transformers',
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
for (const url of validUrls) {
|
|
19
|
+
expect(() => tool.validateUrl(url)).not.toThrow();
|
|
20
|
+
}
|
|
33
21
|
});
|
|
34
22
|
|
|
35
|
-
it('should
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
'https://
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
23
|
+
it('should throw error for URLs not starting with correct prefix', () => {
|
|
24
|
+
const invalidUrls = [
|
|
25
|
+
'https://example.com/docs/something',
|
|
26
|
+
'https://github.com/huggingface/transformers',
|
|
27
|
+
'http://huggingface.co/docs/transformers',
|
|
28
|
+
'huggingface.co/docs/transformers',
|
|
29
|
+
'https://huggingface.co/models/bert-base-uncased',
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
for (const url of invalidUrls) {
|
|
33
|
+
expect(() => tool.validateUrl(url)).toThrow('That was not a valid Hugging Face document URL');
|
|
34
|
+
}
|
|
42
35
|
});
|
|
36
|
+
});
|
|
43
37
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
38
|
+
describe('document chunking', () => {
|
|
39
|
+
it('should return small documents without chunking', async () => {
|
|
40
|
+
|
|
41
|
+
// Mock fetch to return HTML that converts to short markdown
|
|
42
|
+
global.fetch = vi.fn().mockResolvedValue({
|
|
43
|
+
ok: true,
|
|
44
|
+
text: () => Promise.resolve('<h1>Short Document</h1><p>This is a short document.</p>'),
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const result = await tool.fetch({ doc_url: 'https://huggingface.co/docs/test' });
|
|
48
|
+
|
|
49
|
+
expect(result).toContain('# Short Document');
|
|
50
|
+
expect(result).toContain('This is a short document');
|
|
51
|
+
expect(result).not.toContain('DOCUMENT TRUNCATED');
|
|
51
52
|
});
|
|
52
53
|
|
|
53
|
-
it('should
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
it('should chunk large documents and show truncation message', async () => {
|
|
55
|
+
// Mock fetch to return HTML that converts to long markdown
|
|
56
|
+
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);
|
|
57
|
+
|
|
58
|
+
global.fetch = vi.fn().mockResolvedValue({
|
|
59
|
+
ok: true,
|
|
60
|
+
text: () => Promise.resolve(longHtml),
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const result = await tool.fetch({ doc_url: 'https://huggingface.co/docs/test' });
|
|
64
|
+
|
|
65
|
+
expect(result).toContain('# Long Document');
|
|
66
|
+
expect(result).toContain('DOCUMENT TRUNCATED');
|
|
67
|
+
expect(result).toContain('CALL hf_doc_fetch WITH AN OFFSET OF');
|
|
60
68
|
});
|
|
61
69
|
|
|
62
|
-
it('should
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
70
|
+
it('should return subsequent chunks with offset', async () => {
|
|
71
|
+
// Mock fetch to return the same long HTML
|
|
72
|
+
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);
|
|
73
|
+
|
|
74
|
+
global.fetch = vi.fn().mockResolvedValue({
|
|
75
|
+
ok: true,
|
|
76
|
+
text: () => Promise.resolve(longHtml),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// Get first chunk
|
|
80
|
+
const firstChunk = await tool.fetch({ doc_url: 'https://huggingface.co/docs/test' });
|
|
81
|
+
|
|
82
|
+
// Extract offset from truncation message
|
|
83
|
+
const offsetMatch = firstChunk.match(/OFFSET OF (\d+)/);
|
|
84
|
+
expect(offsetMatch).toBeTruthy();
|
|
85
|
+
const offset = parseInt(offsetMatch?.[1] || '0', 10);
|
|
86
|
+
|
|
87
|
+
// Get second chunk
|
|
88
|
+
const secondChunk = await tool.fetch({ doc_url: 'https://huggingface.co/docs/test', offset });
|
|
89
|
+
|
|
90
|
+
expect(secondChunk).not.toEqual(firstChunk);
|
|
91
|
+
expect(secondChunk.length).toBeGreaterThan(0);
|
|
66
92
|
});
|
|
67
93
|
|
|
68
|
-
it('should
|
|
69
|
-
|
|
94
|
+
it('should handle offset beyond document length', async () => {
|
|
95
|
+
global.fetch = vi.fn().mockResolvedValue({
|
|
96
|
+
ok: true,
|
|
97
|
+
text: () => Promise.resolve('<h1>Short Document</h1><p>This is short.</p>'),
|
|
98
|
+
});
|
|
70
99
|
|
|
71
|
-
|
|
100
|
+
const result = await tool.fetch({ doc_url: 'https://huggingface.co/docs/test', offset: 10000 });
|
|
101
|
+
|
|
102
|
+
expect(result).toContain('Error: Offset 10000 is beyond');
|
|
72
103
|
});
|
|
73
104
|
});
|
|
74
|
-
});
|
|
105
|
+
});
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import
|
|
2
|
+
import TurndownService from 'turndown';
|
|
3
|
+
import { estimateTokens } from '../utilities.js';
|
|
3
4
|
|
|
4
5
|
export const DOC_FETCH_CONFIG = {
|
|
5
6
|
name: 'hf_doc_fetch',
|
|
6
|
-
description: 'Fetch a document from the Hugging Face documentation library.',
|
|
7
|
+
description: 'Fetch a document from the Hugging Face documentation library. For large documents, use offset to get subsequent chunks.',
|
|
7
8
|
schema: z.object({
|
|
8
9
|
doc_url: z
|
|
9
10
|
.string()
|
|
10
11
|
.min(28, 'Url should start with https://huggingface.co/docs/')
|
|
11
12
|
.max(200, 'Query too long')
|
|
12
13
|
.describe('Hugging Face documentation URL'),
|
|
14
|
+
offset: z
|
|
15
|
+
.number()
|
|
16
|
+
.min(0)
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('Token offset for large documents (use the offset from truncation message)'),
|
|
13
19
|
}),
|
|
14
20
|
annotations: {
|
|
15
21
|
title: 'Fetch a document from the Hugging Face library',
|
|
@@ -21,72 +27,87 @@ export const DOC_FETCH_CONFIG = {
|
|
|
21
27
|
|
|
22
28
|
export type DocFetchParams = z.infer<typeof DOC_FETCH_CONFIG.schema>;
|
|
23
29
|
|
|
24
|
-
/**
|
|
25
|
-
* Return a (usually) markdown document for a Doc URL
|
|
26
|
-
*
|
|
27
|
-
* There were a few different options for this...
|
|
28
|
-
* 1) Return the HTML directly. Good option would include any post-processing (but prefer markdown)
|
|
29
|
-
* 2) Get the HTML and convert to markdown
|
|
30
|
-
* 3) Get the HTML and follow the GitHub link to get the raw markdown file
|
|
31
|
-
* 4) Use a mapping.
|
|
32
|
-
*
|
|
33
|
-
* There is also the risk that the GitHub HEAD is newer than the indexed version. Will leave as is for now
|
|
34
|
-
* but might want to reconsider this. Mappings were built from:
|
|
35
|
-
* https://github.com/huggingface/doc-builder/blob/main/.github/workflows/build_embeddings.yml
|
|
36
|
-
*
|
|
37
|
-
* Falls back to HTML if no mapping is found...
|
|
38
|
-
*
|
|
39
|
-
*/
|
|
40
30
|
export class DocFetchTool {
|
|
31
|
+
private turndownService: TurndownService;
|
|
32
|
+
|
|
33
|
+
constructor() {
|
|
34
|
+
this.turndownService = new TurndownService({
|
|
35
|
+
headingStyle: 'atx',
|
|
36
|
+
codeBlockStyle: 'fenced',
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
41
40
|
/**
|
|
42
|
-
*
|
|
41
|
+
* Validate HF docs URL
|
|
43
42
|
*/
|
|
44
|
-
|
|
45
|
-
// Validate URL format
|
|
43
|
+
validateUrl(hfUrl: string): void {
|
|
46
44
|
if (!hfUrl.startsWith('https://huggingface.co/docs/')) {
|
|
47
45
|
throw new Error('That was not a valid Hugging Face document URL');
|
|
48
46
|
}
|
|
49
|
-
|
|
50
|
-
// Remove the base URL and any fragment identifier
|
|
51
|
-
const urlPath = hfUrl.replace('https://huggingface.co/docs/', '').split('#')[0] || '';
|
|
52
|
-
|
|
53
|
-
// Extract package name and path
|
|
54
|
-
const parts = urlPath.split('/');
|
|
55
|
-
const packageName = parts[0] || '';
|
|
56
|
-
|
|
57
|
-
// Check if package exists in mapping
|
|
58
|
-
let fetchUrl = hfUrl;
|
|
59
|
-
const mapping = DOC_MAPPINGS[packageName];
|
|
60
|
-
if (mapping) {
|
|
61
|
-
const remainingPath = parts.slice(1).join('/');
|
|
62
|
-
const filePath = remainingPath ? `${remainingPath}.md` : 'index.md';
|
|
63
|
-
|
|
64
|
-
// Construct GitHub raw URL
|
|
65
|
-
const githubUrl = `https://raw.githubusercontent.com/${mapping.repo_id}/refs/heads/main/${mapping.doc_folder}/${filePath}`;
|
|
66
|
-
fetchUrl = githubUrl;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Build the file path
|
|
70
|
-
return fetchUrl;
|
|
71
47
|
}
|
|
72
48
|
|
|
73
49
|
/**
|
|
74
|
-
* Fetch
|
|
50
|
+
* Fetch content from Hugging Face docs URL and convert HTML to Markdown
|
|
75
51
|
*/
|
|
76
|
-
async fetch(
|
|
52
|
+
async fetch(params: DocFetchParams): Promise<string> {
|
|
77
53
|
try {
|
|
78
|
-
|
|
54
|
+
this.validateUrl(params.doc_url);
|
|
79
55
|
|
|
80
|
-
const response = await fetch(
|
|
56
|
+
const response = await fetch(params.doc_url);
|
|
81
57
|
|
|
82
58
|
if (!response.ok) {
|
|
83
59
|
throw new Error(`Failed to fetch document: ${response.status} ${response.statusText}`);
|
|
84
60
|
}
|
|
85
61
|
|
|
86
|
-
const
|
|
87
|
-
|
|
62
|
+
const htmlContent = await response.text();
|
|
63
|
+
|
|
64
|
+
// Convert HTML to Markdown
|
|
65
|
+
const fullMarkdownContent = this.turndownService.turndown(htmlContent);
|
|
66
|
+
|
|
67
|
+
// Apply chunking logic
|
|
68
|
+
return this.applyChunking(fullMarkdownContent, params.offset || 0);
|
|
88
69
|
} catch (error) {
|
|
89
70
|
throw new Error(`Failed to fetch document: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
90
71
|
}
|
|
91
72
|
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Apply chunking logic to markdown content
|
|
76
|
+
*/
|
|
77
|
+
private applyChunking(markdownContent: string, offset: number): string {
|
|
78
|
+
const totalTokens = estimateTokens(markdownContent);
|
|
79
|
+
const maxTokensPerChunk = 7500;
|
|
80
|
+
|
|
81
|
+
// Calculate character positions based on tokens
|
|
82
|
+
const totalChars = markdownContent.length;
|
|
83
|
+
const charsPerToken = totalChars / totalTokens;
|
|
84
|
+
const startChar = Math.floor(offset * charsPerToken);
|
|
85
|
+
|
|
86
|
+
// If offset is beyond document, return error message
|
|
87
|
+
if (startChar >= totalChars) {
|
|
88
|
+
return `Error: Offset ${offset} is beyond the document length (${totalTokens} tokens total).`;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// If document is small enough and no offset, return as-is
|
|
92
|
+
if (totalTokens <= maxTokensPerChunk && offset === 0) {
|
|
93
|
+
return markdownContent;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const maxCharsPerChunk = Math.floor(maxTokensPerChunk * charsPerToken);
|
|
97
|
+
const endChar = Math.min(startChar + maxCharsPerChunk, totalChars);
|
|
98
|
+
const chunk = markdownContent.slice(startChar, endChar);
|
|
99
|
+
|
|
100
|
+
// Calculate next offset
|
|
101
|
+
const nextOffset = offset + estimateTokens(chunk);
|
|
102
|
+
const hasMore = nextOffset < totalTokens;
|
|
103
|
+
|
|
104
|
+
let result = chunk;
|
|
105
|
+
|
|
106
|
+
// Add truncation message if there's more content
|
|
107
|
+
if (hasMore) {
|
|
108
|
+
result += `\n\n=== DOCUMENT TRUNCATED. CALL ${DOC_FETCH_CONFIG.name} WITH AN OFFSET OF ${nextOffset} FOR THE NEXT CHUNK ===`;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return result;
|
|
112
|
+
}
|
|
92
113
|
}
|
|
@@ -312,6 +312,71 @@ describe('DocSearchTool', () => {
|
|
|
312
312
|
|
|
313
313
|
await expect(docSearchTool.search({ query: 'test' })).rejects.toThrow('Failed to search documentation:');
|
|
314
314
|
});
|
|
315
|
+
|
|
316
|
+
it('should handle token budget by truncating or switching to links', async () => {
|
|
317
|
+
// Create a tool with a small token budget to trigger limits
|
|
318
|
+
const smallBudgetTool = new DocSearchTool(undefined, undefined, 5000); // 5k token budget
|
|
319
|
+
|
|
320
|
+
// Create a result with a very long excerpt
|
|
321
|
+
const longText = 'This is a very long text that repeats. '.repeat(100); // ~3900 chars per excerpt
|
|
322
|
+
|
|
323
|
+
// Create many results to exceed budget (5k tokens = ~16.5k chars)
|
|
324
|
+
const manyResults: Array<{
|
|
325
|
+
text: string;
|
|
326
|
+
product: string;
|
|
327
|
+
heading1: string;
|
|
328
|
+
source_page_url: string;
|
|
329
|
+
source_page_title: string;
|
|
330
|
+
heading2: string;
|
|
331
|
+
}> = [];
|
|
332
|
+
// Create enough to exceed token budget when formatted
|
|
333
|
+
for (let i = 0; i < 8; i++) {
|
|
334
|
+
manyResults.push({
|
|
335
|
+
text: longText,
|
|
336
|
+
product: 'hub',
|
|
337
|
+
heading1: `Page ${i}`,
|
|
338
|
+
source_page_url: `https://huggingface.co/docs/hub/page${i}`,
|
|
339
|
+
source_page_title: `Page ${i}`,
|
|
340
|
+
heading2: `Section ${i}`,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
mockFetch.mockResolvedValueOnce({
|
|
345
|
+
ok: true,
|
|
346
|
+
json: () => Promise.resolve(manyResults),
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
const result = await smallBudgetTool.search({ query: 'test' });
|
|
350
|
+
|
|
351
|
+
// Should contain the header
|
|
352
|
+
expect(result).toContain('# Documentation Library Search Results for "test"');
|
|
353
|
+
expect(result).toContain('Found 8 results');
|
|
354
|
+
|
|
355
|
+
// Early results should have full content
|
|
356
|
+
expect(result).toContain('This is a very long text that repeats');
|
|
357
|
+
|
|
358
|
+
// Debug: let's see what the result looks like
|
|
359
|
+
console.log('Result length:', result.length);
|
|
360
|
+
console.log('Estimated tokens:', Math.ceil(result.length / 3.3));
|
|
361
|
+
|
|
362
|
+
// Check that early pages have content
|
|
363
|
+
expect(result).toContain('#### Excerpt from the "Section 0" section');
|
|
364
|
+
expect(result).toContain('This is a very long text that repeats');
|
|
365
|
+
|
|
366
|
+
// With token budget, we should see either truncation or link-only section
|
|
367
|
+
const hasTruncation = result.includes(`*[Content truncated - use ${DOC_FETCH_CONFIG.name} for full text or narrow search terms]*`);
|
|
368
|
+
const hasAdditionalResults = result.includes('## Further results were found in:');
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
// At least one of these should indicate budget management
|
|
372
|
+
expect(hasTruncation || hasAdditionalResults).toBeTruthy();
|
|
373
|
+
|
|
374
|
+
// Should still contain the footer
|
|
375
|
+
expect(result).toContain(`Use the "${DOC_FETCH_CONFIG.name}" tool to fetch a document from the library.`);
|
|
376
|
+
|
|
377
|
+
// Result should be around our smaller token budget (5k tokens = ~16.5k chars)
|
|
378
|
+
expect(result.length).toBeLessThan(25000); // Should be controlled by token budget
|
|
379
|
+
});
|
|
315
380
|
});
|
|
316
381
|
|
|
317
382
|
describe('groupResults', () => {
|