diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 3f58fcc..2f5be40 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -41,15 +41,3 @@ jobs: - name: Deploy Docs to GitHub Pages id: deployment uses: actions/deploy-pages@v4 - - test: - name: Run Unit Test - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 # checkout the repo - - name: Download dependencies # execute tests in tests/ - run: | - npm install - - name: Execute tests # execute tests in tests/ - run: | - npm run test \ No newline at end of file diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index 3d1f58d..575cc0b 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -3,20 +3,20 @@ --dark-hl-0: #569CD6; --light-hl-1: #000000; --dark-hl-1: #D4D4D4; - --light-hl-2: #001080; - --dark-hl-2: #9CDCFE; - --light-hl-3: #795E26; - --dark-hl-3: #DCDCAA; - --light-hl-4: #A31515; - --dark-hl-4: #CE9178; - --light-hl-5: #008000; - --dark-hl-5: #6A9955; - --light-hl-6: #0070C1; - --dark-hl-6: #4FC1FF; - --light-hl-7: #EE0000; - --dark-hl-7: #D7BA7D; - --light-hl-8: #AF00DB; - --dark-hl-8: #C586C0; + --light-hl-2: #0070C1; + --dark-hl-2: #4FC1FF; + --light-hl-3: #AF00DB; + --dark-hl-3: #C586C0; + --light-hl-4: #795E26; + --dark-hl-4: #DCDCAA; + --light-hl-5: #A31515; + --dark-hl-5: #CE9178; + --light-hl-6: #001080; + --dark-hl-6: #9CDCFE; + --light-hl-7: #008000; + --dark-hl-7: #6A9955; + --light-hl-8: #EE0000; + --dark-hl-8: #D7BA7D; --light-hl-9: #098658; --dark-hl-9: #B5CEA8; --light-code-background: #FFFFFF; diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 196a71a..b2a97a7 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAACpWWUW/aMBCA/0qVZ7Rq1TRNvFEKLVphjLhDU9UH41yDhePLHKcFTfvvk1NGE7DP7DX3+XN8Pp/9+DuxsLVJPxltreHCJr1ErKXKDOik/3iICtQvYOz8Zszwjk3vk15ScrtO+slzrYWVqKvLY+bD2hYq6SUbqbOk//nTn96x7ifWtl4BQ+Y+h5UdjtDCYQ0npn0oPngoLRACFz5DgtqCtqFMnVL/pbw6z3kVl475ixSoCd+eIFSVMLyEh4V3pYfgieCppbgFDYY3efcVX74P33Od1zyHKWagFlCqnW/KME3+g8vYxYOVSloJFX0MHJuWICRXwzU3FVG6x2j8ULgRDK95JUXkpB2RcfWUm02Gr5rh3RsaMndBUlzuHMJwqGS5Qm4yv/YEIzdjoi2YZy5CFQHFCrJ9V5grvgPjLeETipx0yq1YByYsXOz7wyAdLHwztcJEsl5B5usFKHjhWgADU4wN/KpBC28hE3hsklQWUnEj7e5658qOC+tPUZgmUzWD2nB1MYPQfWHRNLncTygUryqoLpvPXfPHqy8ddQrcBLehaoIpW4wGU2+7acWpltVgS1iFHUtYxQVyI0vIJCc0/xAyne8bQPedkSvoTOq8Yng3S5fECT5G482hPeJhOpifKXdoXO4uboaHcYT7iCTvsBLb/zLRGWz9V5kHJMQ52IFS77z/lukytO7ANZdRwNeFCKEs3Hp+gLBomrWMDRapNYHEEni0xFujwkXegs7ufkPUAsr9Xw3mk3gDPB5BniiGpRSRW/yt0hhuQFM3eBuLv6jS0egr+zafDIk31YGJ65p1uNZ/a7Auq/ubAeE9han9LZW0KbjXogDv+rtETOXSlELBtZUi+Cjyk5TaQrFEkzFcIHof9l2CUtV5DpWdwdY6fohFqaBxeLVB2lN3T38BdUwos0cNAAA=" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAACpWWUW/aMBCA/0qV52rV0FZNvKUUWjRoGTGrpqoPxrkmFo6d2U4LmvbfJwcKCdgX9sp9fL47n2M//4ksrG3Uj4Zrqymz0WXEci5SDTLqP++jsI0OuIXoMiqpzaN+9FpJZrmS5qoR/pTbQkSX0YrLNOpff/l7eSwZ0TfOlEQ8O6JbNVDSgrT3ZDrB0jpQ/6XsnefsIVKm5BtoO7sdERXK8phBdIZpWsJi7vXsg91FIoV1F/NLVbZaAlHE/RwuqMWdaF8a4juQoGk9Wr7hy3bhCZVZRTOYqhTEHEqx8a0eptEcXOcvFpYLbjmYQCa7yhxL1A01nHVs6hHZ3dwptfmEElgTNS5o5j1tAbRb7lJISmCcikFOtelIvImek7lepepdEnW/RcN5N0FUXG4cQtRA8HKpqE792hMM3emxtKBfKQuNGxRLSHfDOxN0A9p7XE4odNEptSwPLPgOPMsTXnBBNbebm43rOGXWv3CYRlpZuOV/LOIknvucjTAiqVeeg4A3KhkQ0MVIw+8KJPMeRARHW/UAlabi4gFCl5FVuu7lbkUmqDFgruqf2+bPvW8t9aPN66b6rLG2nInGgeMfc2KudrG2vPf1uiVPgOrgHps6mJD5MJ56P96NOHYB1NgTLMOOJ1h2C/iKl5Byimg+EHSvDnOIfzGH7rSkXGaGqMU0niGfh2P07IEcKMmgtD+BWaXj2bh7Jo//0f2Rc1cZUfsUkTKOSESdwaHm+rLy32pHECKkabpnt7UZosYyhbXPHKY7x2iLB80nEN6EWIjD3gd60GLQd06pmqMUzNELImJeOL5R00irIrE6MAwIjp4rokrOQq8QUwpuE3APUAbeTrUJbB+rLANjH2Btn5ROB6ooBdQOrzZIY0u4XNxpSKCg0nIWfHr4yXMPJVEr8KftwbB8LRSuOqLmSnnft22i+7WdDIffyeNsPECe3XumW1fPhrtO77SqSjO5jRHvKeyZu5d/ONS5QQcOAAA=" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 624182b..96302e30 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/torch.html b/docs/classes/torch.html index 39de96d..8bf829c 100644 --- a/docs/classes/torch.html +++ b/docs/classes/torch.html @@ -1,8 +1,11 @@ -torch | ai-research-agent

JS-PyTorch is a neural net matrix multiplication library -with GPU.js acceleration (translates matmul into WebGPU shader code) -and using PyTorch API syntax. -torch -Tensor Creation and Manipulation:

+torch | ai-research-agent

Torch is a neural net matrix multiplication library

+
    +
  1. Uses PyTorch API syntax for tensors and neural nets.
  2. +
  3. Uses GPU.js acceleration to translate matmul into WebGL shader code.
  4. +
  5. Neural Net API: MultiHeadSelfAttention, FullyConnected, Block, +Embedding, PositionalEmbedding, ReLU, Softmax, Dropout, LayerNorm, CrossEntropyLoss
  6. +
+

torch

tensor(data, requires_grad = false, device = 'cpu') Creates a new Tensor filled with the given data

zeros(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with zeros

ones(*shape, requires_grad = false, device = 'cpu') Creates a new Tensor filled with ones

@@ -31,61 +34,62 @@

sqrt(a) Returns element-wise square root of the tensor

exp(a) Returns element-wise exponentiation of the tensor

log(a) Returns element-wise natural log of the tensor

-

Neural Network Layers: -nn.Linear(in_size, out_size, device, bias, xavier) Applies a linear transformation to the input tensor -nn.MultiHeadSelfAttention(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a self-attention layer on the input tensor -nn.FullyConnected(in_size, out_size, dropout_prob, device, bias) Applies a fully-connected layer on the input tensor -nn.Block(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a transformer Block layer on the input tensor -nn.Embedding(in_size, embed_size) Creates an embedding table for vocabulary -nn.PositionalEmbedding(input_size, embed_size) Creates a positional embedding table -nn.ReLU() Applies Rectified Linear Unit activation function -nn.Softmax() Applies Softmax activation function -nn.Dropout(drop_prob) Applies dropout to input tensor -nn.LayerNorm(n_embed) Applies Layer Normalization to input tensor -nn.CrossEntropyLoss() Computes Cross Entropy Loss between target and input tensor

+

torch.nn +Neural Network Layers:

+

nn.Linear(in_size, out_size, device, bias, xavier) Applies a linear transformation to the input tensor

+

nn.MultiHeadSelfAttention(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a self-attention layer on the input tensor

+

nn.FullyConnected(in_size, out_size, dropout_prob, device, bias) Applies a fully-connected layer on the input tensor

+

nn.Block(in_size, out_size, n_heads, n_timesteps, dropout_prob, device) Applies a transformer Block layer on the input tensor

+

nn.Embedding(in_size, embed_size) Creates an embedding table for vocabulary

+

nn.PositionalEmbedding(input_size, embed_size) Creates a positional embedding table

+

nn.ReLU() Applies Rectified Linear Unit activation function

+

nn.Softmax() Applies Softmax activation function

+

nn.Dropout(drop_prob) Applies dropout to input tensor

+

nn.LayerNorm(n_embed) Applies Layer Normalization to input tensor

+

nn.CrossEntropyLoss() Computes Cross Entropy Loss between target and input tensor

Optimization: optim.Adam(params, lr, reg, betas, eps) Adam optimizer for updating model parameters

Utility Functions:

-

save(model, file) Saves the model reruning data blob (for you to save)

-

load(model, loadedData) Loads the model from saved data

+

save(model, file) Saves the model reruning data blob (for you to save)

+

load(model, loadedData) Loads the model from saved data

PyTorch Contributors, Leao, E. et al (2022), See also: Brain.js

-

Properties

Properties

_reshape: ((a: any, shape: any) => any)
add: ((a: any, b: any) => any)
at: ((a: any, idx1: any, idx2: any) => any)
broadcast: ((a: any, b: any) => Tensor)
div: ((a: any, b: any) => any)
exp: ((a: any) => any)
getShape: ((data: any, shape?: any[]) => any[])

Type declaration

    • (data, shape?): any[]
    • import { GPU } from "@eduardoleao052/gpu"

      -

      Parameters

      • data: any
      • shape: any[] = []

      Returns any[]

load: ((model: any, loadedData: any) => any)
log: ((a: any) => any)
masked_fill: ((a: any, mask: any, condition: any, value: any) => any)
matmul: ((a: any, b: any) => any)
mean: ((a: any, dim?: number, keepdims?: boolean) => any)
mul: ((a: any, b: any) => any)
neg: ((a: any) => any)
nn: {
    Block: typeof Block;
    CrossEntropyLoss: typeof CrossEntropyLoss;
    Dropout: typeof Dropout;
    Embedding: typeof Embedding;
    FullyConnected: typeof FullyConnected;
    LayerNorm: typeof LayerNorm;
    Linear: typeof Linear;
    Module: typeof Module;
    MultiHeadSelfAttention: typeof MultiHeadSelfAttention;
    PositionalEmbedding: typeof PositionalEmbedding;
    ReLU: typeof ReLU;
    Softmax: typeof Softmax;
}

Add submodules:

-
ones: ((shape: any, requires_grad?: boolean, device?: string) => Tensor)
optim: {
    Adam: typeof Adam;
}
Parameter: typeof Parameter
pow: ((a: any, n: any) => any)
rand: ((shape: any, requires_grad?: boolean, device?: string) => Tensor)
randint: ((low?: number, high?: number, shape?: number[], requires_grad?: boolean) => Tensor)
randn: ((shape: any, requires_grad?: boolean, device?: string, xavier?: boolean) => Tensor)
reshape: ((a: any, shape: any) => any)
save: ((model: any, file: any) => string)
sqrt: ((a: any) => any)
tensor: ((data: any, requires_grad?: boolean, device?: string) => Tensor)
Tensor: typeof Tensor

Add methods from tensor.js (these methods are accessed with "torch."):

-
transpose: ((a: any, dim1: any, dim2: any) => any)
tril: ((shape: any, requires_grad?: boolean, device?: string) => Tensor)
variance: ((a: any, dim?: number, keepdims?: boolean) => any)
zeros: ((shape: any, requires_grad?: boolean, device?: string) => Tensor)
diff --git a/docs/functions/addEmbeddingVectorsToIndex.html b/docs/functions/addEmbeddingVectorsToIndex.html new file mode 100644 index 0000000..0a98edd --- /dev/null +++ b/docs/functions/addEmbeddingVectorsToIndex.html @@ -0,0 +1,27 @@ +addEmbeddingVectorsToIndex | ai-research-agent

Function addEmbeddingVectorsToIndex

  • +
      +
    1. Compile hnswlib-node or NGT algorithm C++ to WASM JS for efficient similarity search.
    2. +
    3. Vector index is split by K-means into regional clusters, each being a +specific size to fit in RAM. This is better than popular vector engines that +require costly 100gb-RAM servers because they load all the vectors at once.
    4. +
    5. Vectors for centroids of each cluster are stored in a list in SQL, each +cluster's binary quantized data is exported as base64 string to SQL, S3, etc.
    6. +
    7. Search: Embed Query, Compare to each cluster centroid to pick top clusters, +download base64 strings for those clusters, load each into WASM, find top neighbors +per cluster, merge results sorted by distance.
    8. +
    +

    NGT Algorithm +NGT Cluster

    +

    Vald Vector Engine Docs +ANN Benchmarks

    +

    Parameters

    • documentVectors: string[]

      An array of document texts to be vectorized.

      +
    • Optionaloptions: {
          numDimensions: number;
          maxElements: number;
      } = {}

      Optional parameters for vector generation and indexing.

      +
      • numDimensions: number

        The length of data point vector that will be indexed.

        +
      • maxElements: number

        The maximum number of data points.

        +

    Returns Promise<HierarchicalNSW>

    The created HNSW index.

    +
diff --git a/docs/functions/convertEmbeddingsToHNSW.html b/docs/functions/convertEmbeddingsToHNSW.html deleted file mode 100644 index c11e753..0000000 --- a/docs/functions/convertEmbeddingsToHNSW.html +++ /dev/null @@ -1,17 +0,0 @@ -convertEmbeddingsToHNSW | ai-research-agent

Function convertEmbeddingsToHNSW

  • Generates vectors for a set of documents and creates an HNSW index using -hnswlib in C++ compiled to WASM JS for efficient similarity search.

    -

    ANN Benchmarks

    -

    https://github.com/brtholomy/hnsw -Pinecone - HNSW

    -

    Parameters

    • documentVectors: string[]

      An array of document texts to be vectorized.

      -
    • Optionaloptions: {
          maxElements: number;
          numDimensions: number;
      } = {}

      Optional parameters for vector generation and indexing.

      -
      • maxElements: number

        The maximum number of data points.

        -
      • numDimensions: number

        The length of data point vector that will be indexed.

        -

    Returns Promise<HierarchicalNSW>

    The created HNSW index.

    -
diff --git a/docs/functions/convertEmbeddingsToUMAP.html b/docs/functions/convertEmbeddingsToUMAP.html index 207b96b..5db1a8a 100644 --- a/docs/functions/convertEmbeddingsToUMAP.html +++ b/docs/functions/convertEmbeddingsToUMAP.html @@ -32,15 +32,16 @@

Understanding UMAP
UMAP Algorithm Overview
-

+ +

Parameters

  • embeddingsDict: {}

    The dictionary of embeddings.

    -
    • Optionaloptions: {
          numberDimensions: number;
          numberDistance: number;
          numberNeighbors: number;
      } = {}
      • numberDimensions: number

        [default=2] - The number of dimensions for UMAP output.

        -
      • numberDistance: number

        [default=0.1] - The minimum distance parameter for UMAP.

        +
        • Optionaloptions: {
              numberDimensions: number;
              numberNeighbors: number;
              numberDistance: number;
          } = {}
          • numberDimensions: number

            [default=2] - The number of dimensions for UMAP output.

          • numberNeighbors: number

            [default=15] - The number of nearest neighbors for UMAP.

            +
          • numberDistance: number

            [default=0.1] - The minimum distance parameter for UMAP.

      Returns Promise<PlotDataPoint[]>

      An array of plot data points.

      diff --git a/docs/functions/convertHTMLSpecialChars.html b/docs/functions/convertHTMLSpecialChars.html index d97e349..1dda1dc 100644 --- a/docs/functions/convertHTMLSpecialChars.html +++ b/docs/functions/convertHTMLSpecialChars.html @@ -4,10 +4,10 @@
    • unescape: boolean = true

      default=true - If true, converts & codes to characters. If false, converts characters to codes.

    • Returns string

      The processed string.

      -
      var normalHTML = convertHTMLSpecialChars('&lt;p&gt;This &amp; that &copy; 2023 '+
      '&quot;Quotes&quot;&#39;Apostrophes&#39; &euro;100 &#x263A;&lt;/p&gt;', true)
      console.log(normalHTML) // Returns: "<p>This & that © 2023 "Quotes" 'Apostrophes' €100 ☺</p>" +
      var normalHTML = convertHTMLSpecialChars('&lt;p&gt;This &amp; that &copy; 2023 '+
      '&quot;Quotes&quot;&#39;Apostrophes&#39; &euro;100 &#x263A;&lt;/p&gt;', true)
      console.log(normalHTML) // Returns: "<p>This & that © 2023 "Quotes" 'Apostrophes' €100 ☺</p>"
      -
      diff --git a/docs/functions/convertHTMLToBasicHTML.html b/docs/functions/convertHTMLToBasicHTML.html index c3f7183..100b627 100644 --- a/docs/functions/convertHTMLToBasicHTML.html +++ b/docs/functions/convertHTMLToBasicHTML.html @@ -6,21 +6,18 @@ Source Code of Browser HTML DOM
      RegExp JS V8 Code

      Parameters

      Returns string

      basic text formatting html

      Gulakov, A. (2024)

      -
      diff --git a/docs/functions/convertMarkdownToHtml.html b/docs/functions/convertMarkdownToHtml.html index 5a6c578..d0f7dda 100644 --- a/docs/functions/convertMarkdownToHtml.html +++ b/docs/functions/convertMarkdownToHtml.html @@ -11,10 +11,10 @@

      Parameters

      Returns string

      The resulting HTML string.

      -
      const markdown = "# Header\n\nThis is **bold** and *italic* text.\n\n* List item 1\n* List item 2";
      const html = convertMarkdownToHtml(markdown);
      console.log(html);
      // Output:
      // <h1>Header</h1>
      // <p>This is <strong>bold</strong> and <em>italic</em> text.</p>
      // <ul><li>List item 1</li><li>List item 2</li></ul> +
      const markdown = "# Header\n\nThis is **bold** and *italic* text.\n\n* List item 1\n* List item 2";
      const html = convertMarkdownToHtml(markdown);
      console.log(html);
      // Output:
      // <h1>Header</h1>
      // <p>This is <strong>bold</strong> and <em>italic</em> text.</p>
      // <ul><li>List item 1</li><li>List item 2</li></ul>
      -
      diff --git a/docs/functions/convertMathLaTexToImage.html b/docs/functions/convertMathLaTexToImage.html new file mode 100644 index 0000000..607f236 --- /dev/null +++ b/docs/functions/convertMathLaTexToImage.html @@ -0,0 +1,8 @@ +convertMathLaTexToImage | ai-research-agent

      Function convertMathLaTexToImage

      • Convert LaTex <math> equations found inside HTML +into easy-to-read SVG and HTML with KaTex.js.

        +

        Parameters

        • html: string

          html with math Latex

          +

        Returns string

        html with SVG of equations

        +
      diff --git a/docs/functions/convertPDFToHTML.html b/docs/functions/convertPDFToHTML.html index 23385b0..537ebab 100644 --- a/docs/functions/convertPDFToHTML.html +++ b/docs/functions/convertPDFToHTML.html @@ -2,14 +2,14 @@ page headers, footnotes, and infering section headings based on standard deviation of range from average text height.

      Parameters

      • pdfURLOrBuffer: string

        URL to a PDF file or buffer from fs.readFile

        -
      • Optionaloptions: {
            addHeadingsTags: boolean;
            addPageNumbers: boolean;
            addSentenceLineBreaks: boolean;
            moveFootnotes: boolean;
            removePageHeaders: boolean;
            timeout: boolean;
        } = {}
          +
      • Optionaloptions: {
            addHeadingsTags: boolean;
            addPageNumbers: boolean;
            addSentenceLineBreaks: boolean;
            removePageHeaders: boolean;
            moveFootnotes: boolean;
            timeout: boolean;
        } = {}
        • addHeadingsTags: boolean

          default=true - Adds H1 tags to heading titles in document

        • addPageNumbers: boolean

          default=true - Adds # to end of each page

        • addSentenceLineBreaks: boolean

          default=true - Inserts line breaks at the end of sentence ranges

          -
        • moveFootnotes: boolean

          default=false - Moves footnotes to end of document

        • removePageHeaders: boolean

          default=true - Removes repeated headers found on each page

          +
        • moveFootnotes: boolean

          default=false - Moves footnotes to end of document

        • timeout: boolean

          default=10 - http request timeout

      Returns any

      HTML formatted text or {error} if error in parsing

      Gulakov, A. (2024), diff --git a/docs/functions/convertTextToEmbedding.html b/docs/functions/convertTextToEmbedding.html index 4f4605f..9baeda6 100644 --- a/docs/functions/convertTextToEmbedding.html +++ b/docs/functions/convertTextToEmbedding.html @@ -1,4 +1,4 @@ -convertTextToEmbedding | ai-research-agent

      Function convertTextToEmbedding

      • Text embeddings convert words or phrases into numerical vectors in a high-dimensional +convertTextToEmbedding | ai-research-agent

        Function convertTextToEmbedding

        • Text embeddings convert words or phrases into numerical vectors in a high-dimensional space, where each dimension represents a semantic feature extracted by a model like MiniLM-L6-v2. In this concept space, words with similar meanings have vectors that are close together, allowing for quantitative comparisons of semantic similarity. @@ -12,7 +12,7 @@

          Parameters

          • text: string

            The text to embed.

          • Optionaloptions: {
                pipeline: AutoTokenizer;
                precision: number;
            } = {}
            • pipeline: AutoTokenizer

              The pipeline to use for embedding.

            • precision: number

              default=3 - The number of decimal places to round to.

              -

          Returns Promise<{
              embedding: number[];
              embeddingsDict: {};
          }>

            +

      Returns Promise<{
          embeddingsDict: {};
          embedding: number[];
      }>

      diff --git a/docs/functions/embedYoutubePlayer.html b/docs/functions/embedYoutubePlayer.html index b147db5..f775cd9 100644 --- a/docs/functions/embedYoutubePlayer.html +++ b/docs/functions/embedYoutubePlayer.html @@ -2,7 +2,7 @@ href="https://developers.google.com/youtube/iframe_api_reference">YouTube IFrame Player API in a div element with the specified ID.

      Returns YouTubePlayer

      An object containing the YouTube API functionality.

      -
      // <div id="player"></div>
      const YT = embedYoutubePlayer();
      new YT.Player('player', {
      height: '360',
      width: '640',
      videoId: 'dQw4w9WgXcQ',
      events: {
      'onReady': onPlayerReady,
      'onStateChange': null,
      'onTimeChange': onTimeChange,
      }
      });
      function onPlayerReady(event) {
      event.target.playVideo();
      }
      function onTimeChange(time) {
      console.log(time)
      } +
      // <div id="player"></div>
      const YT = embedYoutubePlayer();
      new YT.Player('player', {
      height: '360',
      width: '640',
      videoId: 'dQw4w9WgXcQ',
      events: {
      'onReady': onPlayerReady,
      'onStateChange': null,
      'onTimeChange': onTimeChange,
      }
      });
      function onPlayerReady(event) {
      event.target.playVideo();
      }
      function onTimeChange(time) {
      console.log(time)
      }
      diff --git a/docs/functions/extract.html b/docs/functions/extract.html index 7edf08e..d7e5642 100644 --- a/docs/functions/extract.html +++ b/docs/functions/extract.html @@ -1,25 +1,26 @@ -extract | ai-research-agent

      Function extract

      • 🚜📜 Tractor the Text Extractor


        -Extract URL or HTML to main content, based on Readability with improved version - using 100+ custom adapters for major websites.
        -Strips to basic HTML for reading mode or saving research notes.
        -Youtube - get full transcript for video if detected a youtube video.
        -PDF - Extracts formatted text from PDF with parsing of headings, page headers, -footnotes, and adding linebreaks based on standard deviation of range text height.
        +extract | ai-research-agent

        Function extract

          1. +
          2. Extract URL or HTML to main content, based on Readability with improved version +using 100+ custom adapters for major websites.
          3. +
          4. Strips to basic HTML for reading mode or saving research notes.
          5. +
          6. Youtube - get full transcript for video if detected a youtube video.
          7. +
          8. PDF - Extracts formatted text from PDF with parsing of headings, page headers, +footnotes, and adding linebreaks based on standard deviation of range text height.
          9. +


          Parameters

          • urlOrDoc: string | Document

            url or dom object with article content

            -
          • Optionaloptions: {
                absoluteURLs: boolean;
                formatting: boolean;
                images: boolean;
                links: boolean;
                timeout: number;
            } = {}
              +
          • Optionaloptions: {
                images: boolean;
                links: boolean;
                formatting: boolean;
                absoluteURLs: boolean;
                timeout: number;
            } = {}
            -
            • absoluteURLs: boolean

              default=true - convert URLs to absolute

              -
            • formatting: boolean

              default=true - preserve formatting

              -
            • images: boolean

              default=true - include images

              +
              • images: boolean

                default=true - include images

              • links: boolean

                default=true - include links

                +
              • formatting: boolean

                default=true - preserve formatting

                +
              • absoluteURLs: boolean

                default=true - convert URLs to absolute

              • timeout: number

                default=5 - http request timeout

                -

          Returns Article

            +

      Returns Article

      • object containing url, html, author, date, title, source
      diff --git a/docs/functions/extractCite.html b/docs/functions/extractCite.html index 4782671..f8cb97b 100644 --- a/docs/functions/extractCite.html +++ b/docs/functions/extractCite.html @@ -4,11 +4,12 @@ against common list of 90k first names, last names,and organizations to infer if it should be reversed starting by author last name (accounting for affixes/titles), since organizations are not reversed.

      -

      Article-extraction-benchmark

      +

      Article-extraction-benchmark +

      Parameters

      • document: Document

        dom object or html string with article content

      Returns any

      {author, date, title, source}

      diff --git a/docs/functions/extractContentHTML.html b/docs/functions/extractContentHTML.html index 6322b7b..39bf9c6 100644 --- a/docs/functions/extractContentHTML.html +++ b/docs/functions/extractContentHTML.html @@ -67,7 +67,7 @@
    • minTextLength: number

      default=25 - Minimum length of text to be considered valid

    • retryLength: number

      default=250 - Length to retry content extraction if initial attempt fails

    • Returns Element

      Extracted HTML element of main content such as article body

      -
      var url = "https://www.nytimes.com/2024/08/28/business/telegram-ceo-pavel-durov-charged.html"
      const html = await (await fetch(url)).text();
      var articleContent = extractContentHTML(html); +
      var url = "https://www.nytimes.com/2024/08/28/business/telegram-ceo-pavel-durov-charged.html"
      const html = await (await fetch(url)).text();
      var articleContent = extractContentHTML(html);

      Based on Mozilla Readability (2015), Arc90 (2010)

      diff --git a/docs/functions/extractContentHTML2.html b/docs/functions/extractContentHTML2.html index 9336e68..e455057 100644 --- a/docs/functions/extractContentHTML2.html +++ b/docs/functions/extractContentHTML2.html @@ -22,17 +22,17 @@

      Article Extraction Benchmark

      Parameters

      • html: string

        The HTML content to extract from.

        -
      • Optionalopts: {
            cleanConditionally: boolean;
            stripUnlikelyCandidates: boolean;
            weightNodes: boolean;
        }

        The options for content extraction.

        -
        • cleanConditionally: boolean

          default=true - Clean the node to remove superfluous content -like forms, ads, etc. Initially, pass in the most restrictive options which will return the highest -quality content. On each failure, retry with slightly more lax options.

          -
        • stripUnlikelyCandidates: boolean

          default=true - Remove elements that match non-article- +

        • Optionalopts: {
              stripUnlikelyCandidates: boolean;
              weightNodes: boolean;
              cleanConditionally: boolean;
          }

          The options for content extraction.

          +
          • stripUnlikelyCandidates: boolean

            default=true - Remove elements that match non-article- like criteria first (e.g., elements with a classname of "comment").

          • weightNodes: boolean

            default=true - Modify an element's score based on certain classNames or IDs (e.g., subtract if a node has a className of 'comment', add if a node has an ID of 'entry-content').

            +
          • cleanConditionally: boolean

            default=true - Clean the node to remove superfluous content +like forms, ads, etc. Initially, pass in the most restrictive options which will return the highest +quality content. On each failure, retry with slightly more lax options.

      Returns string

      The extracted content as an HTML string, or null if extraction fails.

      Based on Postlight Mercury Parser (2017-)

      -
      var url =  "https://en.wikipedia.org/wiki/David_Hilbert"
      var html = await (await fetch(url)).text();
      var content = extractContentHTML(html);
      console.log(content); // HTML content of main article body +
      var url =  "https://en.wikipedia.org/wiki/David_Hilbert"
      var html = await (await fetch(url)).text();
      var content = extractContentHTML(html);
      console.log(content); // HTML content of main article body
      diff --git a/docs/functions/getAllEmbeddings.html b/docs/functions/getAllEmbeddings.html index db62447..fbdd32d 100644 --- a/docs/functions/getAllEmbeddings.html +++ b/docs/functions/getAllEmbeddings.html @@ -3,7 +3,7 @@
    • Optionalprecision: number = 3

      The number of decimal places to round to.

    • Returns number[][]

      An array of embedding vectors. *

      -
      diff --git a/docs/functions/getEmbeddingModel.html b/docs/functions/getEmbeddingModel.html index 41d6bf2..a3f7c5d 100644 --- a/docs/functions/getEmbeddingModel.html +++ b/docs/functions/getEmbeddingModel.html @@ -1,10 +1,10 @@ getEmbeddingModel | ai-research-agent

      Function getEmbeddingModel

      • Initialize HuggingFace Transformers pipeline for embedding text.

        -

        Parameters

        • Optionaloptions: {
              modelName: string;
              pipelineName: string;
          } = {}
          • modelName: string

            default="Xenova/all-MiniLM-L6-v2" - +

            Parameters

            • Optionaloptions: {
                  pipelineName: string;
                  modelName: string;
              } = {}
              • pipelineName: string

                default "feature-extraction",

                +
              • modelName: string

                default="Xenova/all-MiniLM-L6-v2" - The name of the model to use

                -
              • pipelineName: string

                default "feature-extraction",

            Returns Promise<AutoTokenizer>

            The pipeline. *

            -
      diff --git a/docs/functions/importVectorIndexFromString.html b/docs/functions/importVectorIndexFromString.html index a12640a..e144e60 100644 --- a/docs/functions/importVectorIndexFromString.html +++ b/docs/functions/importVectorIndexFromString.html @@ -3,7 +3,7 @@
    • dim: number = 384

      The dimensionality of the vectors in the index.

    • space: string = "cosine"

      The space type of the index (e.g., 'l2', 'ip', 'cosine').

    • Returns Promise<any>

      A promise that resolves to the imported HNSW index object.

      -
      diff --git a/docs/functions/matchQUASAR.html b/docs/functions/matchQUASAR.html index 86cf68f..d022abc 100644 --- a/docs/functions/matchQUASAR.html +++ b/docs/functions/matchQUASAR.html @@ -3,7 +3,7 @@ in web search engines. Single line function that can be used anywhere, such as UI inputs to filter a data list.

      Parameters

      • document: string
      • query: string

      Returns boolean

      true if doc has all words and "phrases in quotes"

      -
      var isFound = matchQUASAR(`Ask not what your country can do for you, 
      ask what you can do for your country. is nothing to fear but fear itself.`,
      ` "Ask not" "but fear itself" nothing`) // returns true +
      var isFound = matchQUASAR(`Ask not what your country can do for you, 
      ask what you can do for your country. is nothing to fear but fear itself.`,
      ` "Ask not" "but fear itself" nothing`) // returns true

      Gulakov, A. (2024)

      diff --git a/docs/functions/scrapeURL.html b/docs/functions/scrapeURL.html index dbb79d6..628ac09 100644 --- a/docs/functions/scrapeURL.html +++ b/docs/functions/scrapeURL.html @@ -11,20 +11,20 @@ query string like this: http://localhost:3000/?url=https://example.org

      Parameters

      • url: string

        any domain's URL

        -
      • Optionaloptions: {
            changeReferer: number;
            checkBotDetection: number;
            maxRedirects: number;
            timeout: number;
            urlProxy: string;
            useCORSProxy: number;
            userAgentIndex: number;
        } = {}
          +
      • Optionaloptions: {
            timeout: number;
            maxRedirects: number;
            checkBotDetection: number;
            changeReferer: number;
            userAgentIndex: number;
            useCORSProxy: number;
            urlProxy: string;
        } = {}
        -
        • changeReferer: number

          default=true - set referer as google

          -
        • checkBotDetection: number

          default=true - check for bot detection messages

          +
          • timeout: number

            default=5 - abort request if not retrived, in seconds

          • maxRedirects: number

            default=3 - max redirects to follow

            -
          • timeout: number

            default=5 - abort request if not retrived, in seconds

            -
          • urlProxy: string

            default=false - use proxy url

            -
          • useCORSProxy: number

            default=false - use 60%-working corsproxy.io (in frontend JS)

            +
          • checkBotDetection: number

            default=true - check for bot detection messages

            +
          • changeReferer: number

            default=true - set referer as google

          • userAgentIndex: number

            default=0 - index of [google bot, default chrome]

            +
          • useCORSProxy: number

            default=false - use 60%-working corsproxy.io (in frontend JS)

            +
          • urlProxy: string

            default=false - use proxy url

      Returns Promise<any>

      • HTML, JSON, arraybuffer, or error object
      -
      await scrapeURL("https://hckrnews.com", {timeout: 5, userAgentIndex: 1})
      +
      await scrapeURL("https://hckrnews.com", {timeout: 5, userAgentIndex: 1})
       

      Gulakov, A. (2024)

      diff --git a/docs/functions/searchSTREAM.html b/docs/functions/searchSTREAM.html index 54af9ff..df5ff8d 100644 --- a/docs/functions/searchSTREAM.html +++ b/docs/functions/searchSTREAM.html @@ -8,14 +8,14 @@ Llama, OpenAI, or Anthropic API, and suggests follow-up queries.

      Parameters

      • query: string

        The search query string.

        -
      • Optionaloptions: {
            categoryIndex: number;
            customSearxngDomain: string;
            maxRetries: number;
            maxTopResultsToExtract: number;
            recencyIndex: number;
        } = {}
        • categoryIndex: number

          default=0 - Index of the search category.

          -
        • customSearxngDomain: string

          default=null - Use your custom domain SearXNG

          +
        • Optionaloptions: {
              categoryIndex: number;
              recencyIndex: number;
              maxRetries: number;
              maxTopResultsToExtract: number;
              customSearxngDomain: string;
          } = {}
          • categoryIndex: number

            default=0 - Index of the search category.

            +
          • recencyIndex: number

            default=0 - Index representing the recency of results.

          • maxRetries: number

            default=5 - Maximum number of retry attempts for the search.

          • maxTopResultsToExtract: number

            default=6 - Maximum number of top results to extract and analyze.

            -
          • recencyIndex: number

            default=0 - Index representing the recency of results.

            +
          • customSearxngDomain: string

            default=null - Use your custom domain SearXNG

      Returns Promise<any[]>

      A promise that resolves to an array containing the search results, extracted information, and generated answer.

      -
      const advancedResults = await searchSTREAM('Latest developments in quantum computing', {
      categoryIndex: 2,
      recencyIndex: 1,
      maxRetries: 5,
      maxTopResultsToExtract: 10
      }); +
      const advancedResults = await searchSTREAM('Latest developments in quantum computing', {
      categoryIndex: 2,
      recencyIndex: 1,
      maxRetries: 5,
      maxTopResultsToExtract: 10
      });

      Gulakov, A. (2024)

      diff --git a/docs/functions/searchVectorIndex.html b/docs/functions/searchVectorIndex.html index 84a7241..a380da3 100644 --- a/docs/functions/searchVectorIndex.html +++ b/docs/functions/searchVectorIndex.html @@ -1,14 +1,14 @@ -searchVectorIndex | ai-research-agent

      Function searchVectorIndex

      • Searches the vector index for the nearest neighbors of a given query.

        -

        Parameters

        • index: HierarchicalNSW

          The HNSW index to search.

          +searchVectorIndex | ai-research-agent

          Function searchVectorIndex

          • Searches the vector index for the nearest neighbors of a given query.

            +

            Parameters

            • index: HierarchicalNSW

              The HNSW index to search.

            • query: string

              The query string to search for.

            • Optionaloptions: {
                  numNeighbors: number;
              } = {}

              Optional parameters for the search.

              • numNeighbors: number

                The number of nearest neighbors to return.

                -

            Returns Promise<{
                distance: number;
                id: number;
            }[]>

            A promise that resolves to an array of nearest neighbors, each with an id and distance.

            +

      Returns Promise<{
          id: number;
          distance: number;
      }[]>

      A promise that resolves to an array of nearest neighbors, each with an id and distance.

      If there's an error during the search process.

      -
      const index = await convertEmbeddingsToHNSW(documentVectors);
      const results = await searchVectorIndex(index, 'example query');
      console.log(results); // [{id: 3, distance: 0.1}, {id: 7, distance: 0.2}, ...] +
      const index = await addEmbeddingVectorsToIndex(documentVectors);
      const results = await searchVectorIndex(index, 'example query');
      console.log(results); // [{id: 3, distance: 0.1}, {id: 7, distance: 0.2}, ...]
      -
      diff --git a/docs/functions/searchWeb.html b/docs/functions/searchWeb.html index 77d8177..19601a7 100644 --- a/docs/functions/searchWeb.html +++ b/docs/functions/searchWeb.html @@ -1,18 +1,18 @@ -searchWeb | ai-research-agent

      Function searchWeb

      • Search Web via SearXNG metasearch of all major search engines. +searchWeb | ai-research-agent

        Function searchWeb

        • Search Web via SearXNG metasearch of all major search engines. Options are 10 search categories, recency, and how many times to retry other domains if first time fails. SearXNG is a free internet metasearch engine which aggregates results from more than 70 search services.

          Parameters

          • query: string

            The search query string.

            -
          • Optionaloptions: {
                category: number;
                customSearxngDomain: string | boolean;
                maxRetries: number;
                page: number;
                recency: number;
            } = {}
            • category: number

              default=0 - ["general", "news", "videos", "images", +

            • Optionaloptions: {
                  category: number;
                  recency: number;
                  customSearxngDomain: string | boolean;
                  maxRetries: number;
                  page: number;
              } = {}
              • category: number

                default=0 - ["general", "news", "videos", "images", "science", "map", "music", "it", "files", "social+media"]

                +
              • recency: number

                default=0 - ["", "day", "week", "month", "year"]

              • customSearxngDomain: string | boolean

                default=null - Use your custom domain SearXNG

              • maxRetries: number

                default=3 - Maximum number of retry attempts if the initial search fails.

              • page: number

                default=1 - The page number to retrieve.

                -
              • recency: number

                default=0 - ["", "day", "week", "month", "year"]

                -

          Returns Promise<{
              engines: string[];
              snippet: string;
              title: string;
              url: string;
          }[]>

          An array of search result objects.

          +

      Returns Promise<{
          title: string;
          url: string;
          snippet: string;
          engines: string[];
      }[]>

      An array of search result objects.

      Throws an error if the search fails after all retry attempts.

      -
      const advancedResults = await searchWeb('Node.js', {
      category: 2,
      recency: 1,
      maxRetries: 5
      }); +
      const advancedResults = await searchWeb('Node.js', {
      category: 2,
      recency: 1,
      maxRetries: 5
      });

      Gulakov, A. (2024) diff --git a/docs/functions/searchWikipedia.html b/docs/functions/searchWikipedia.html index 71fd371..7e49b05 100644 --- a/docs/functions/searchWikipedia.html +++ b/docs/functions/searchWikipedia.html @@ -3,15 +3,15 @@ documentation and is dificult to parse and clean up results.

      Parameters

      • query: string

        search phrase

        -
      • Optionaloptions: {
            filterDisambiguation: boolean;
            images: boolean;
            imageSize: number;
            limitSearchResults: number;
            plainText: boolean;
            searchInTitleOnly: boolean;
            summarySentenceLimit: number;
        } = {}
        • filterDisambiguation: boolean

          default=true Filter disambiguation pages

          +
        • Optionaloptions: {
              plainText: boolean;
              summarySentenceLimit: number;
              limitSearchResults: number;
              images: boolean;
              imageSize: number;
              searchInTitleOnly: boolean;
              filterDisambiguation: boolean;
          } = {}
          • plainText: boolean

            default=false Return plain text instead of HTML

            +
          • summarySentenceLimit: number

            default=3 Limit summary to this many sentences

            +
          • limitSearchResults: number

            default=1 Limit number of search results

          • images: boolean

            default=true Include image in results

          • imageSize: number

            default=200 Image size in pixels

            -
          • limitSearchResults: number

            default=1 Limit number of search results

            -
          • plainText: boolean

            default=false Return plain text instead of HTML

          • searchInTitleOnly: boolean

            default=false Search in title only

            -
          • summarySentenceLimit: number

            default=3 Limit summary to this many sentences

            +
          • filterDisambiguation: boolean

            default=true Filter disambiguation pages

      Returns any

      {results: [ {title, summary, image}, ...]}

      -
      await searchWikipedia("JavaScript", { plainText: true })
      +
      await searchWikipedia("JavaScript", { plainText: true })
       

      Gulakov, A. (2024)

      diff --git a/docs/functions/splitSentences.html b/docs/functions/splitSentences.html index a4da6d9..244b665 100644 --- a/docs/functions/splitSentences.html +++ b/docs/functions/splitSentences.html @@ -1,12 +1,12 @@ splitSentences | ai-research-agent

      Function splitSentences

      • Splits text into sentences, handling 220+ common abbreviations, and infering acronyms, numbers, URLs, times, names, etc.

        Parameters

        • inputText: string

          The text to be split into sentences.

          -
        • Optionaloptions: {
              maxSize: number;
              minSize: number;
              splitOnHtmlTags: boolean;
          } = {}
            +
        • Optionaloptions: {
              splitOnHtmlTags: boolean;
              minSize: number;
              maxSize: number;
          } = {}
          -
          • maxSize: number

            default=600 - Maximum size for a sentence.

            +
            • splitOnHtmlTags: boolean

              default=true - Split on HTML tags like P, DIV, UL, OL.

            • minSize: number

              default=20 - Minimum size for a sentence.

              -
            • splitOnHtmlTags: boolean

              default=true - Split on HTML tags like P, DIV, UL, OL.

              +
            • maxSize: number

              default=600 - Maximum size for a sentence.

        Returns string[]

        An array of sentences. *

        Gulakov, A. (2024)

        diff --git a/docs/functions/splitTextSemanticChars.html b/docs/functions/splitTextSemanticChars.html index ad3138f..93f0248 100644 --- a/docs/functions/splitTextSemanticChars.html +++ b/docs/functions/splitTextSemanticChars.html @@ -21,14 +21,15 @@

        The function applies various length constraints to each type of element to ensure reasonable chunk sizes. It also handles nested structures and special cases like code blocks and math expressions.

        +

        Sentence RAG Benchmarks

        Parameters

        • text: string

          The input text to be split into semantic chunks.

        • Optionaloptions: any = {}

          Optional configuration options (currently unused).

        Returns string[]

        An array of text chunks, each representing a semantic unit of the document.

        Jina AI (2024)

        -
        const text = "# Heading\n\nThis is a paragraph.\n\n- List item 1\n- List item 2\n\n";
        const chunks = splitTextSemanticChars(text);
        console.log(chunks);
        // Output: ['# Heading', 'This is a paragraph.', '- List item 1', '- List item 2'] +
        const text = "# Heading\n\nThis is a paragraph.\n\n- List item 1\n- List item 2\n\n";
        const chunks = splitTextSemanticChars(text);
        console.log(chunks);
        // Output: ['# Heading', 'This is a paragraph.', '- List item 1', '- List item 2']
        -
      diff --git a/docs/functions/stemWordToRoot.html b/docs/functions/stemWordToRoot.html index 56e7663..f069119 100644 --- a/docs/functions/stemWordToRoot.html +++ b/docs/functions/stemWordToRoot.html @@ -6,7 +6,7 @@
    • The stemmed word
    • Porter, M. (1980)

      -
      var rootWord = stemWordToRoot("running"); // returns "run"
      +
      var rootWord = stemWordToRoot("running"); // returns "run"
       

      Function suggestNextWordCompletions

      • Completes the query with the most likely next words for phrases. If typing 2+ letters of a word, returns all possible words matching those few letters.

        Parameters

        • query: string

          The input query which can be pertial words or phrases.

          -
        • Optionaloptions: {
              limitMaxResults: number;
              numberOfLastWordsToCheck: number;
              phrasesModel: any;
          } = {}
          • limitMaxResults: number

            default=10 - The maximum number of autocomplete suggestions to return.

            +
          • Optionaloptions: {
                phrasesModel: any;
                limitMaxResults: number;
                numberOfLastWordsToCheck: number;
            } = {}
            • phrasesModel: any

              A custom phrases model to use for autocomplete suggestions.

              +
            • limitMaxResults: number

              default=10 - The maximum number of autocomplete suggestions to return.

            • numberOfLastWordsToCheck: number

              default=5 - The number of last words in the query to check for phrase completions.

              -
            • phrasesModel: any

              A custom phrases model to use for autocomplete suggestions.

        Returns Promise<any[]>

        An array of autocomplete suggestions, each containing either a 'phrase' or 'word' property.

        -
        // Basic usage
        const suggestions = await suggestNextWordCompletions("self att");
        // Possible output: [{ phrase: "self attention" }, { phrase: "self attract" }, { phrase: "self attack" }] +
        // Basic usage
        const suggestions = await suggestNextWordCompletions("self att");
        // Possible output: [{ phrase: "self attention" }, { phrase: "self attract" }, { phrase: "self attack" }]
        -
        // Using options
        const customModel = await import("./custom-phrases-model.json");
        const suggestions = await suggestNextWordCompletions("artificial int", {
        phrasesModel: customModel,
        limitMaxResults: 5,
        numberOfLastWordsToCheck: 3
        });
        // Possible output: [{ phrase: "artificial intelligence" }, { phrase: "artificial interpretation" }] +
        // Using options
        const customModel = await import("./custom-phrases-model.json");
        const suggestions = await suggestNextWordCompletions("artificial int", {
        phrasesModel: customModel,
        limitMaxResults: 5,
        numberOfLastWordsToCheck: 3
        });
        // Possible output: [{ phrase: "artificial intelligence" }, { phrase: "artificial interpretation" }]

        Gulakov, A. (2024)

        diff --git a/docs/functions/weighRelevanceConceptVectorAPI.html b/docs/functions/weighRelevanceConceptVectorAPI.html index ec9dd29..34b8dcb 100644 --- a/docs/functions/weighRelevanceConceptVectorAPI.html +++ b/docs/functions/weighRelevanceConceptVectorAPI.html @@ -6,11 +6,11 @@ or longer passage, depending on the model being used.

      • sentences: string[]

        A list of strings which will be compared against the source_sentence.

        -
      • Optionaloptions: {
            HF_API_KEY: string;
            model: string;
        } = {}
          +
      • Optionaloptions: {
            model: string;
            HF_API_KEY: string;
        } = {}
        -

      Returns Promise<any>

      array of 0-1 similarity scores for each sentence *

      ai-research-agent

      - +

      Javascript Docs (airesearch.js.org)

      Live Demo (qwksearch.com)

      @@ -54,18 +54,6 @@

      Live Demo (qwksearch.com)Rerank documents's chunks based on relevance to query, using embeddings by convert text to concept vector of numbers within LLM "concept space", and cosine similarity of query to topic, returning the sentences central to key relevant parts of the article.
    • Research Agent prompt with key sentences from relevant sources to answer via Groq Llama, OpenAI, or Anthropic API Key and suggest follow-ups
    • -

      - -

      -

      extract Docs

      -
        -
      • Extract URL or HTML to main content, improved version combining Mozilla Readability and Postlight Mercury
      • -
      • using 100+ custom adapters for major websites.
      • -
      • Strips to basic HTML for reading mode or saving research notes
      • -
      • Youtube - get full transcript for video if detected a youtube video
      • -
      • PDF - Extracts formatted text from PDF with parsing of linebreaks, page headers, footnotes, and adding infer headings based on standard deviation from average text height
      • -
      • Cite - Extract author, date, source, and title from HTML using meta tags and common class names. Validates human name from author string to check against common list of 90k first names, last names, and organizations to infer if last name should be reversed starting by author last name (accounting for affixes/titles), since organizations are not reversed.
      • -

      @@ -109,6 +97,17 @@

      Live Demo (qwksearch.com) +

      + +

      +

      extract Docs

      +
        +
      1. Extract URL or HTML to main content, improved version combining Mozilla Readability and Postlight Mercury using 100+ custom adapters for major websites.
      2. +
      3. Strips to basic HTML for reading mode or saving research notes
      4. +
      5. Youtube - get full transcript for video if detected a youtube video
      6. +
      7. PDF - Extracts formatted text from PDF with parsing of linebreaks, page headers, footnotes, and adding infer headings based on standard deviation from average text height
      8. +
      9. Cite - Extract author, date, source, and title from HTML using meta tags and common class names. Validates human name from author string to check against common list of 90k first names, last names, and organizations to infer if last name should be reversed starting by author last name (accounting for affixes/titles), since organizations are not reversed.
      10. +

      @@ -166,7 +165,7 @@

      Live Demo (qwksearch.com)Can LLMs Generate Novel Research Ideas?

      PRs Welcome

      -

      diff --git a/docs/interfaces/Article.html b/docs/interfaces/Article.html new file mode 100644 index 0000000..198d82c --- /dev/null +++ b/docs/interfaces/Article.html @@ -0,0 +1,24 @@ +Article | ai-research-agent

      Interface Article

      interface Article {
          url: string;
          html: string;
          author: string;
          author_cite: string;
          author_short: string;
          author_type: number;
          date: string;
          title: string;
          source: string;
          word_count: number;
      }

      Properties

      url: string

      The URL of the article

      +
      html: string

      The HTML content of the article

      +
      author: string

      The author of the article

      +
      author_cite: string

      Author name in Last, First Middle format

      +
      author_short: string

      Author name in Last format

      +
      author_type: number

      Author type ["single", "two-author", "more-than-two", "organization"]

      +
      date: string

      The publication date of the article

      +
      title: string

      The title of the article

      +
      source: string

      The source or origin of the article

      +
      word_count: number

      The word count of the full text (without HTML tags)

      +
      diff --git a/docs/modules.html b/docs/modules.html index ce1ffe3..134ac68 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,40 +1,42 @@ -ai-research-agent

      ai-research-agent

      Index

      Extract

      convertPDFToHTML -convertYoutubeToText -extract -extractCite +ai-research-agent