From d4e5f4f1a07b374cd417c24e2b66bfb9cd70a457 Mon Sep 17 00:00:00 2001 From: Adhityan K V Date: Sun, 6 Oct 2024 20:30:44 +0200 Subject: [PATCH 1/3] chore: added mintlify starter kit --- docs/README.md | 32 +++ docs/api-reference/endpoint/create.mdx | 4 + docs/api-reference/endpoint/delete.mdx | 4 + docs/api-reference/endpoint/get.mdx | 4 + docs/api-reference/introduction.mdx | 33 +++ docs/api-reference/openapi.json | 195 +++++++++++++++ docs/development.mdx | 98 ++++++++ docs/essentials/code.mdx | 37 +++ docs/essentials/images.mdx | 59 +++++ docs/essentials/markdown.mdx | 88 +++++++ docs/essentials/navigation.mdx | 66 +++++ docs/essentials/reusable-snippets.mdx | 110 +++++++++ docs/essentials/settings.mdx | 318 +++++++++++++++++++++++++ docs/favicon.svg | 49 ++++ docs/images/checks-passed.png | Bin 0 -> 160724 bytes docs/images/hero-dark.svg | 161 +++++++++++++ docs/images/hero-light.svg | 155 ++++++++++++ docs/introduction.mdx | 71 ++++++ docs/logo/dark.svg | 55 +++++ docs/logo/light.svg | 51 ++++ docs/mint.json | 91 +++++++ docs/quickstart.mdx | 86 +++++++ docs/snippets/snippet-intro.mdx | 4 + 23 files changed, 1771 insertions(+) create mode 100644 docs/README.md create mode 100644 docs/api-reference/endpoint/create.mdx create mode 100644 docs/api-reference/endpoint/delete.mdx create mode 100644 docs/api-reference/endpoint/get.mdx create mode 100644 docs/api-reference/introduction.mdx create mode 100644 docs/api-reference/openapi.json create mode 100644 docs/development.mdx create mode 100644 docs/essentials/code.mdx create mode 100644 docs/essentials/images.mdx create mode 100644 docs/essentials/markdown.mdx create mode 100644 docs/essentials/navigation.mdx create mode 100644 docs/essentials/reusable-snippets.mdx create mode 100644 docs/essentials/settings.mdx create mode 100644 docs/favicon.svg create mode 100644 docs/images/checks-passed.png create mode 100644 docs/images/hero-dark.svg create mode 100644 docs/images/hero-light.svg create mode 100644 docs/introduction.mdx create mode 100644 docs/logo/dark.svg create mode 100644 docs/logo/light.svg create mode 100644 docs/mint.json create mode 100644 docs/quickstart.mdx create mode 100644 docs/snippets/snippet-intro.mdx diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..4cbe0750 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,32 @@ +# Mintlify Starter Kit + +Click on `Use this template` to copy the Mintlify starter kit. The starter kit contains examples including + +- Guide pages +- Navigation +- Customizations +- API Reference pages +- Use of popular components + +### Development + +Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation changes locally. To install, use the following command + +``` +npm i -g mintlify +``` + +Run the following command at the root of your documentation (where mint.json is) + +``` +mintlify dev +``` + +### Publishing Changes + +Install our Github App to auto propagate changes from your repo to your deployment. Changes will be deployed to production automatically after pushing to the default branch. Find the link to install on your dashboard. + +#### Troubleshooting + +- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies. +- Page loads as a 404 - Make sure you are running in a folder with `mint.json` diff --git a/docs/api-reference/endpoint/create.mdx b/docs/api-reference/endpoint/create.mdx new file mode 100644 index 00000000..5689f1b6 --- /dev/null +++ b/docs/api-reference/endpoint/create.mdx @@ -0,0 +1,4 @@ +--- +title: 'Create Plant' +openapi: 'POST /plants' +--- diff --git a/docs/api-reference/endpoint/delete.mdx b/docs/api-reference/endpoint/delete.mdx new file mode 100644 index 00000000..657dfc87 --- /dev/null +++ b/docs/api-reference/endpoint/delete.mdx @@ -0,0 +1,4 @@ +--- +title: 'Delete Plant' +openapi: 'DELETE /plants/{id}' +--- diff --git a/docs/api-reference/endpoint/get.mdx b/docs/api-reference/endpoint/get.mdx new file mode 100644 index 00000000..56aa09ec --- /dev/null +++ b/docs/api-reference/endpoint/get.mdx @@ -0,0 +1,4 @@ +--- +title: 'Get Plants' +openapi: 'GET /plants' +--- diff --git a/docs/api-reference/introduction.mdx b/docs/api-reference/introduction.mdx new file mode 100644 index 00000000..c835b78b --- /dev/null +++ b/docs/api-reference/introduction.mdx @@ -0,0 +1,33 @@ +--- +title: 'Introduction' +description: 'Example section for showcasing API endpoints' +--- + + + If you're not looking to build API reference documentation, you can delete + this section by removing the api-reference folder. + + +## Welcome + +There are two ways to build API documentation: [OpenAPI](https://mintlify.com/docs/api-playground/openapi/setup) and [MDX components](https://mintlify.com/docs/api-playground/mdx/configuration). For the starter kit, we are using the following OpenAPI specification. + + + View the OpenAPI specification file + + +## Authentication + +All API endpoints are authenticated using Bearer tokens and picked up from the specification file. + +```json +"security": [ + { + "bearerAuth": [] + } +] +``` diff --git a/docs/api-reference/openapi.json b/docs/api-reference/openapi.json new file mode 100644 index 00000000..b1509be0 --- /dev/null +++ b/docs/api-reference/openapi.json @@ -0,0 +1,195 @@ +{ + "openapi": "3.0.1", + "info": { + "title": "OpenAPI Plant Store", + "description": "A sample API that uses a plant store as an example to demonstrate features in the OpenAPI specification", + "license": { + "name": "MIT" + }, + "version": "1.0.0" + }, + "servers": [ + { + "url": "http://sandbox.mintlify.com" + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "paths": { + "/plants": { + "get": { + "description": "Returns all plants from the system that the user has access to", + "parameters": [ + { + "name": "limit", + "in": "query", + "description": "The maximum number of results to return", + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Plant response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Plant" + } + } + } + } + }, + "400": { + "description": "Unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "post": { + "description": "Creates a new plant in the store", + "requestBody": { + "description": "Plant to add to the store", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NewPlant" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "plant response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Plant" + } + } + } + }, + "400": { + "description": "unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/plants/{id}": { + "delete": { + "description": "Deletes a single plant based on the ID supplied", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "ID of plant to delete", + "required": true, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "204": { + "description": "Plant deleted", + "content": {} + }, + "400": { + "description": "unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Plant": { + "required": [ + "name" + ], + "type": "object", + "properties": { + "name": { + "description": "The name of the plant", + "type": "string" + }, + "tag": { + "description": "Tag to specify the type", + "type": "string" + } + } + }, + "NewPlant": { + "allOf": [ + { + "$ref": "#/components/schemas/Plant" + }, + { + "required": [ + "id" + ], + "type": "object", + "properties": { + "id": { + "description": "Identification number of the plant", + "type": "integer", + "format": "int64" + } + } + } + ] + }, + "Error": { + "required": [ + "error", + "message" + ], + "type": "object", + "properties": { + "error": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + } + } + } + }, + "securitySchemes": { + "bearerAuth": { + "type": "http", + "scheme": "bearer" + } + } + } +} \ No newline at end of file diff --git a/docs/development.mdx b/docs/development.mdx new file mode 100644 index 00000000..87830089 --- /dev/null +++ b/docs/development.mdx @@ -0,0 +1,98 @@ +--- +title: 'Development' +description: 'Learn how to preview changes locally' +--- + + + **Prerequisite** You should have installed Node.js (version 18.10.0 or + higher). + + +Step 1. Install Mintlify on your OS: + + + +```bash npm +npm i -g mintlify +``` + +```bash yarn +yarn global add mintlify +``` + + + +Step 2. Go to the docs are located (where you can find `mint.json`) and run the following command: + +```bash +mintlify dev +``` + +The documentation website is now available at `http://localhost:3000`. + +### Custom Ports + +Mintlify uses port 3000 by default. You can use the `--port` flag to customize the port Mintlify runs on. For example, use this command to run in port 3333: + +```bash +mintlify dev --port 3333 +``` + +You will see an error like this if you try to run Mintlify in a port that's already taken: + +```md +Error: listen EADDRINUSE: address already in use :::3000 +``` + +## Mintlify Versions + +Each CLI is linked to a specific version of Mintlify. Please update the CLI if your local website looks different than production. + + + +```bash npm +npm i -g mintlify@latest +``` + +```bash yarn +yarn global upgrade mintlify +``` + + + +## Deployment + + + Unlimited editors available under the [Startup + Plan](https://mintlify.com/pricing) + + +You should see the following if the deploy successfully went through: + + + + + +## Troubleshooting + +Here's how to solve some common problems when working with the CLI. + + + + Update to Node v18. Run `mintlify install` and try again. + + +Go to the `C:/Users/Username/.mintlify/` directory and remove the `mint` +folder. Then Open the Git Bash in this location and run `git clone +https://github.com/mintlify/mint.git`. + +Repeat step 3. + + + + Try navigating to the root of your device and delete the ~/.mintlify folder. + Then run `mintlify dev` again. + + + +Curious about what changed in a CLI version? [Check out the CLI changelog.](/changelog/command-line) diff --git a/docs/essentials/code.mdx b/docs/essentials/code.mdx new file mode 100644 index 00000000..d2a462a7 --- /dev/null +++ b/docs/essentials/code.mdx @@ -0,0 +1,37 @@ +--- +title: 'Code Blocks' +description: 'Display inline code and code blocks' +icon: 'code' +--- + +## Basic + +### Inline Code + +To denote a `word` or `phrase` as code, enclose it in backticks (`). + +``` +To denote a `word` or `phrase` as code, enclose it in backticks (`). +``` + +### Code Block + +Use [fenced code blocks](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) by enclosing code in three backticks and follow the leading ticks with the programming language of your snippet to get syntax highlighting. Optionally, you can also write the name of your code after the programming language. + +```java HelloWorld.java +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` + +````md +```java HelloWorld.java +class HelloWorld { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` +```` diff --git a/docs/essentials/images.mdx b/docs/essentials/images.mdx new file mode 100644 index 00000000..60ad42d3 --- /dev/null +++ b/docs/essentials/images.mdx @@ -0,0 +1,59 @@ +--- +title: 'Images and Embeds' +description: 'Add image, video, and other HTML elements' +icon: 'image' +--- + + + +## Image + +### Using Markdown + +The [markdown syntax](https://www.markdownguide.org/basic-syntax/#images) lets you add images using the following code + +```md +![title](/path/image.jpg) +``` + +Note that the image file size must be less than 5MB. Otherwise, we recommend hosting on a service like [Cloudinary](https://cloudinary.com/) or [S3](https://aws.amazon.com/s3/). You can then use that URL and embed. + +### Using Embeds + +To get more customizability with images, you can also use [embeds](/writing-content/embed) to add images + +```html + +``` + +## Embeds and HTML elements + + + +
+ + + +Mintlify supports [HTML tags in Markdown](https://www.markdownguide.org/basic-syntax/#html). This is helpful if you prefer HTML tags to Markdown syntax, and lets you create documentation with infinite flexibility. + + + +### iFrames + +Loads another HTML page within the document. Most commonly used for embedding videos. + +```html + +``` diff --git a/docs/essentials/markdown.mdx b/docs/essentials/markdown.mdx new file mode 100644 index 00000000..c8ad9c1f --- /dev/null +++ b/docs/essentials/markdown.mdx @@ -0,0 +1,88 @@ +--- +title: 'Markdown Syntax' +description: 'Text, title, and styling in standard markdown' +icon: 'text-size' +--- + +## Titles + +Best used for section headers. + +```md +## Titles +``` + +### Subtitles + +Best use to subsection headers. + +```md +### Subtitles +``` + + + +Each **title** and **subtitle** creates an anchor and also shows up on the table of contents on the right. + + + +## Text Formatting + +We support most markdown formatting. Simply add `**`, `_`, or `~` around text to format it. + +| Style | How to write it | Result | +| ------------- | ----------------- | --------------- | +| Bold | `**bold**` | **bold** | +| Italic | `_italic_` | _italic_ | +| Strikethrough | `~strikethrough~` | ~strikethrough~ | + +You can combine these. For example, write `**_bold and italic_**` to get **_bold and italic_** text. + +You need to use HTML to write superscript and subscript text. That is, add `` or `` around your text. + +| Text Size | How to write it | Result | +| ----------- | ------------------------ | ---------------------- | +| Superscript | `superscript` | superscript | +| Subscript | `subscript` | subscript | + +## Linking to Pages + +You can add a link by wrapping text in `[]()`. You would write `[link to google](https://google.com)` to [link to google](https://google.com). + +Links to pages in your docs need to be root-relative. Basically, you should include the entire folder path. For example, `[link to text](/writing-content/text)` links to the page "Text" in our components section. + +Relative links like `[link to text](../text)` will open slower because we cannot optimize them as easily. + +## Blockquotes + +### Singleline + +To create a blockquote, add a `>` in front of a paragraph. + +> Dorothy followed her through many of the beautiful rooms in her castle. + +```md +> Dorothy followed her through many of the beautiful rooms in her castle. +``` + +### Multiline + +> Dorothy followed her through many of the beautiful rooms in her castle. +> +> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. + +```md +> Dorothy followed her through many of the beautiful rooms in her castle. +> +> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. +``` + +### LaTeX + +Mintlify supports [LaTeX](https://www.latex-project.org) through the Latex component. + +8 x (vk x H1 - H2) = (0,1) + +```md +8 x (vk x H1 - H2) = (0,1) +``` diff --git a/docs/essentials/navigation.mdx b/docs/essentials/navigation.mdx new file mode 100644 index 00000000..ca44bb64 --- /dev/null +++ b/docs/essentials/navigation.mdx @@ -0,0 +1,66 @@ +--- +title: 'Navigation' +description: 'The navigation field in mint.json defines the pages that go in the navigation menu' +icon: 'map' +--- + +The navigation menu is the list of links on every website. + +You will likely update `mint.json` every time you add a new page. Pages do not show up automatically. + +## Navigation syntax + +Our navigation syntax is recursive which means you can make nested navigation groups. You don't need to include `.mdx` in page names. + + + +```json Regular Navigation +"navigation": [ + { + "group": "Getting Started", + "pages": ["quickstart"] + } +] +``` + +```json Nested Navigation +"navigation": [ + { + "group": "Getting Started", + "pages": [ + "quickstart", + { + "group": "Nested Reference Pages", + "pages": ["nested-reference-page"] + } + ] + } +] +``` + + + +## Folders + +Simply put your MDX files in folders and update the paths in `mint.json`. + +For example, to have a page at `https://yoursite.com/your-folder/your-page` you would make a folder called `your-folder` containing an MDX file called `your-page.mdx`. + + + +You cannot use `api` for the name of a folder unless you nest it inside another folder. Mintlify uses Next.js which reserves the top-level `api` folder for internal server calls. A folder name such as `api-reference` would be accepted. + + + +```json Navigation With Folder +"navigation": [ + { + "group": "Group Name", + "pages": ["your-folder/your-page"] + } +] +``` + +## Hidden Pages + +MDX files not included in `mint.json` will not show up in the sidebar but are accessible through the search bar and by linking directly to them. diff --git a/docs/essentials/reusable-snippets.mdx b/docs/essentials/reusable-snippets.mdx new file mode 100644 index 00000000..a0a55297 --- /dev/null +++ b/docs/essentials/reusable-snippets.mdx @@ -0,0 +1,110 @@ +--- +title: Reusable Snippets +description: Reusable, custom snippets to keep content in sync +icon: 'recycle' +--- + +import SnippetIntro from '/snippets/snippet-intro.mdx'; + + + +## Creating a custom snippet + +**Pre-condition**: You must create your snippet file in the `snippets` directory. + + + Any page in the `snippets` directory will be treated as a snippet and will not + be rendered into a standalone page. If you want to create a standalone page + from the snippet, import the snippet into another file and call it as a + component. + + +### Default export + +1. Add content to your snippet file that you want to re-use across multiple + locations. Optionally, you can add variables that can be filled in via props + when you import the snippet. + +```mdx snippets/my-snippet.mdx +Hello world! This is my content I want to reuse across pages. My keyword of the +day is {word}. +``` + + + The content that you want to reuse must be inside the `snippets` directory in + order for the import to work. + + +2. Import the snippet into your destination file. + +```mdx destination-file.mdx +--- +title: My title +description: My Description +--- + +import MySnippet from '/snippets/path/to/my-snippet.mdx'; + +## Header + +Lorem impsum dolor sit amet. + + +``` + +### Reusable variables + +1. Export a variable from your snippet file: + +```mdx snippets/path/to/custom-variables.mdx +export const myName = 'my name'; + +export const myObject = { fruit: 'strawberries' }; +``` + +2. Import the snippet from your destination file and use the variable: + +```mdx destination-file.mdx +--- +title: My title +description: My Description +--- + +import { myName, myObject } from '/snippets/path/to/custom-variables.mdx'; + +Hello, my name is {myName} and I like {myObject.fruit}. +``` + +### Reusable components + +1. Inside your snippet file, create a component that takes in props by exporting + your component in the form of an arrow function. + +```mdx snippets/custom-component.mdx +export const MyComponent = ({ title }) => ( +
+

{title}

+

... snippet content ...

+
+); +``` + + + MDX does not compile inside the body of an arrow function. Stick to HTML + syntax when you can or use a default export if you need to use MDX. + + +2. Import the snippet into your destination file and pass in the props + +```mdx destination-file.mdx +--- +title: My title +description: My Description +--- + +import { MyComponent } from '/snippets/custom-component.mdx'; + +Lorem ipsum dolor sit amet. + + +``` diff --git a/docs/essentials/settings.mdx b/docs/essentials/settings.mdx new file mode 100644 index 00000000..d9dd2d7e --- /dev/null +++ b/docs/essentials/settings.mdx @@ -0,0 +1,318 @@ +--- +title: 'Global Settings' +description: 'Mintlify gives you complete control over the look and feel of your documentation using the mint.json file' +icon: 'gear' +--- + +Every Mintlify site needs a `mint.json` file with the core configuration settings. Learn more about the [properties](#properties) below. + +## Properties + + +Name of your project. Used for the global title. + +Example: `mintlify` + + + + + An array of groups with all the pages within that group + + + The name of the group. + + Example: `Settings` + + + + The relative paths to the markdown files that will serve as pages. + + Example: `["customization", "page"]` + + + + + + + + Path to logo image or object with path to "light" and "dark" mode logo images + + + Path to the logo in light mode + + + Path to the logo in dark mode + + + Where clicking on the logo links you to + + + + + + Path to the favicon image + + + + Hex color codes for your global theme + + + The primary color. Used for most often for highlighted content, section + headers, accents, in light mode + + + The primary color for dark mode. Used for most often for highlighted + content, section headers, accents, in dark mode + + + The primary color for important buttons + + + The color of the background in both light and dark mode + + + The hex color code of the background in light mode + + + The hex color code of the background in dark mode + + + + + + + + Array of `name`s and `url`s of links you want to include in the topbar + + + The name of the button. + + Example: `Contact us` + + + The url once you click on the button. Example: `https://mintlify.com/contact` + + + + + + + + + Link shows a button. GitHub shows the repo information at the url provided including the number of GitHub stars. + + + If `link`: What the button links to. + + If `github`: Link to the repository to load GitHub information from. + + + Text inside the button. Only required if `type` is a `link`. + + + + + + + Array of version names. Only use this if you want to show different versions + of docs with a dropdown in the navigation bar. + + + + An array of the anchors, includes the `icon`, `color`, and `url`. + + + The [Font Awesome](https://fontawesome.com/search?s=brands%2Cduotone) icon used to feature the anchor. + + Example: `comments` + + + The name of the anchor label. + + Example: `Community` + + + The start of the URL that marks what pages go in the anchor. Generally, this is the name of the folder you put your pages in. + + + The hex color of the anchor icon background. Can also be a gradient if you pass an object with the properties `from` and `to` that are each a hex color. + + + Used if you want to hide an anchor until the correct docs version is selected. + + + Pass `true` if you want to hide the anchor until you directly link someone to docs inside it. + + + One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin" + + + + + + + Override the default configurations for the top-most anchor. + + + The name of the top-most anchor + + + Font Awesome icon. + + + One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin" + + + + + + An array of navigational tabs. + + + The name of the tab label. + + + The start of the URL that marks what pages go in the tab. Generally, this + is the name of the folder you put your pages in. + + + + + + Configuration for API settings. Learn more about API pages at [API Components](/api-playground/demo). + + + The base url for all API endpoints. If `baseUrl` is an array, it will enable for multiple base url + options that the user can toggle. + + + + + + The authentication strategy used for all API endpoints. + + + The name of the authentication parameter used in the API playground. + + If method is `basic`, the format should be `[usernameName]:[passwordName]` + + + The default value that's designed to be a prefix for the authentication input field. + + E.g. If an `inputPrefix` of `AuthKey` would inherit the default input result of the authentication field as `AuthKey`. + + + + + + Configurations for the API playground + + + + Whether the playground is showing, hidden, or only displaying the endpoint with no added user interactivity `simple` + + Learn more at the [playground guides](/api-playground/demo) + + + + + + Enabling this flag ensures that key ordering in OpenAPI pages matches the key ordering defined in the OpenAPI file. + + This behavior will soon be enabled by default, at which point this field will be deprecated. + + + + + + + A string or an array of strings of URL(s) or relative path(s) pointing to your + OpenAPI file. + + Examples: + + ```json Absolute + "openapi": "https://example.com/openapi.json" + ``` + ```json Relative + "openapi": "/openapi.json" + ``` + ```json Multiple + "openapi": ["https://example.com/openapi1.json", "/openapi2.json", "/openapi3.json"] + ``` + + + + + + An object of social media accounts where the key:property pair represents the social media platform and the account url. + + Example: + ```json + { + "x": "https://x.com/mintlify", + "website": "https://mintlify.com" + } + ``` + + + One of the following values `website`, `facebook`, `x`, `discord`, `slack`, `github`, `linkedin`, `instagram`, `hacker-news` + + Example: `x` + + + The URL to the social platform. + + Example: `https://x.com/mintlify` + + + + + + Configurations to enable feedback buttons + + + + Enables a button to allow users to suggest edits via pull requests + + + Enables a button to allow users to raise an issue about the documentation + + + + + + Customize the dark mode toggle. + + + Set if you always want to show light or dark mode for new users. When not + set, we default to the same mode as the user's operating system. + + + Set to true to hide the dark/light mode toggle. You can combine `isHidden` with `default` to force your docs to only use light or dark mode. For example: + + + ```json Only Dark Mode + "modeToggle": { + "default": "dark", + "isHidden": true + } + ``` + + ```json Only Light Mode + "modeToggle": { + "default": "light", + "isHidden": true + } + ``` + + + + + + + + + A background image to be displayed behind every page. See example with + [Infisical](https://infisical.com/docs) and [FRPC](https://frpc.io). + diff --git a/docs/favicon.svg b/docs/favicon.svg new file mode 100644 index 00000000..6a323326 --- /dev/null +++ b/docs/favicon.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/checks-passed.png b/docs/images/checks-passed.png new file mode 100644 index 0000000000000000000000000000000000000000..3303c773646ca12fb6852356663540e3ed048115 GIT binary patch literal 160724 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/hero-light.svg b/docs/images/hero-light.svg new file mode 100644 index 00000000..297d68fb --- /dev/null +++ b/docs/images/hero-light.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/introduction.mdx b/docs/introduction.mdx new file mode 100644 index 00000000..2589c0b9 --- /dev/null +++ b/docs/introduction.mdx @@ -0,0 +1,71 @@ +--- +title: Introduction +description: 'Welcome to the home of your new documentation' +--- + +Hero Light +Hero Dark + +## Setting up + +The first step to world-class documentation is setting up your editing environments. + + + + Get your docs set up locally for easy development + + + Preview your changes before you push to make sure they're perfect + + + +## Make it yours + +Update your docs to your brand and add valuable content for the best user conversion. + + + + Customize your docs to your company's colors and brands + + + Automatically generate endpoints from an OpenAPI spec + + + Build interactive features and designs to guide your users + + + Check out our showcase of our favorite documentation + + diff --git a/docs/logo/dark.svg b/docs/logo/dark.svg new file mode 100644 index 00000000..a6283786 --- /dev/null +++ b/docs/logo/dark.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/logo/light.svg b/docs/logo/light.svg new file mode 100644 index 00000000..582b3b95 --- /dev/null +++ b/docs/logo/light.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/mint.json b/docs/mint.json new file mode 100644 index 00000000..d6f7e33d --- /dev/null +++ b/docs/mint.json @@ -0,0 +1,91 @@ +{ + "$schema": "https://mintlify.com/schema.json", + "name": "Starter Kit", + "logo": { + "dark": "/logo/dark.svg", + "light": "/logo/light.svg" + }, + "favicon": "/favicon.svg", + "colors": { + "primary": "#0D9373", + "light": "#07C983", + "dark": "#0D9373", + "anchors": { + "from": "#0D9373", + "to": "#07C983" + } + }, + "topbarLinks": [ + { + "name": "Support", + "url": "mailto:hi@mintlify.com" + } + ], + "topbarCtaButton": { + "name": "Dashboard", + "url": "https://dashboard.mintlify.com" + }, + "tabs": [ + { + "name": "API Reference", + "url": "api-reference" + } + ], + "anchors": [ + { + "name": "Documentation", + "icon": "book-open-cover", + "url": "https://mintlify.com/docs" + }, + { + "name": "Community", + "icon": "slack", + "url": "https://mintlify.com/community" + }, + { + "name": "Blog", + "icon": "newspaper", + "url": "https://mintlify.com/blog" + } + ], + "navigation": [ + { + "group": "Get Started", + "pages": [ + "introduction", + "quickstart", + "development" + ] + }, + { + "group": "Essentials", + "pages": [ + "essentials/markdown", + "essentials/code", + "essentials/images", + "essentials/settings", + "essentials/navigation", + "essentials/reusable-snippets" + ] + }, + { + "group": "API Documentation", + "pages": [ + "api-reference/introduction" + ] + }, + { + "group": "Endpoint Examples", + "pages": [ + "api-reference/endpoint/get", + "api-reference/endpoint/create", + "api-reference/endpoint/delete" + ] + } + ], + "footerSocials": { + "x": "https://x.com/mintlify", + "github": "https://github.com/mintlify", + "linkedin": "https://www.linkedin.com/company/mintsearch" + } +} \ No newline at end of file diff --git a/docs/quickstart.mdx b/docs/quickstart.mdx new file mode 100644 index 00000000..c44cfaaf --- /dev/null +++ b/docs/quickstart.mdx @@ -0,0 +1,86 @@ +--- +title: 'Quickstart' +description: 'Start building awesome documentation in under 5 minutes' +--- + +## Setup your development + +Learn how to update your docs locally and deploy them to the public. + +### Edit and preview + + + + During the onboarding process, we created a repository on your Github with + your docs content. You can find this repository on our + [dashboard](https://dashboard.mintlify.com). To clone the repository + locally, follow these + [instructions](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) + in your terminal. + + + Previewing helps you make sure your changes look as intended. We built a + command line interface to render these changes locally. 1. Install the + [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the + documentation changes locally with this command: ``` npm i -g mintlify ``` + 2. Run the following command at the root of your documentation (where + `mint.json` is): ``` mintlify dev ``` + + + +### Deploy your changes + + + + + Our Github app automatically deploys your changes to your docs site, so you + don't need to manage deployments yourself. You can find the link to install on + your [dashboard](https://dashboard.mintlify.com). Once the bot has been + successfully installed, there should be a check mark next to the commit hash + of the repo. + + + [Commit and push your changes to + Git](https://docs.github.com/en/get-started/using-git/pushing-commits-to-a-remote-repository#about-git-push) + for your changes to update in your docs site. If you push and don't see that + the Github app successfully deployed your changes, you can also manually + update your docs through our [dashboard](https://dashboard.mintlify.com). + + + + +## Update your docs + +Add content directly in your files with MDX syntax and React components. You can use any of our components, or even build your own. + + + + + Add flair to your docs with personalized branding. + + + + Implement your OpenAPI spec and enable API user interaction. + + + + Draw insights from user interactions with your documentation. + + + + Keep your docs on your own website's subdomain. + + + diff --git a/docs/snippets/snippet-intro.mdx b/docs/snippets/snippet-intro.mdx new file mode 100644 index 00000000..c57e7c75 --- /dev/null +++ b/docs/snippets/snippet-intro.mdx @@ -0,0 +1,4 @@ +One of the core principles of software development is DRY (Don't Repeat +Yourself). This is a principle that apply to documentation as +well. If you find yourself repeating the same content in multiple places, you +should consider creating a custom snippet to keep your content in sync. From 28d918a5976c3f6b58434e67bbc7ca7ee2282b20 Mon Sep 17 00:00:00 2001 From: Adhityan K V Date: Wed, 9 Oct 2024 19:15:43 +0200 Subject: [PATCH 2/3] feat: new doc website + merged conversations with cache --- .prettierignore | 3 +- README.md | 1312 +---------------- core/embedjs-interfaces/src/index.ts | 3 +- .../src/interfaces/base-cache.ts | 9 + .../src/interfaces/base-conversations.ts | 8 - .../src/interfaces/base-loader.ts | 11 +- .../src/interfaces/base-model.ts | 14 +- core/embedjs/README.md | 1312 +---------------- core/embedjs/src/cache/memory-cache.ts | 36 +- .../src/conversation/memory-conversations.ts | 41 - .../src/core/rag-application-builder.ts | 88 +- core/embedjs/src/core/rag-application.ts | 69 +- databases/embedjs-lmdb/src/lmdb-cache.ts | 28 +- databases/embedjs-mongodb/src/index.ts | 1 - databases/embedjs-mongodb/src/mongo-cache.ts | 96 +- .../src/mongo-conversations.ts | 82 -- databases/embedjs-redis/src/redis-cache.ts | 31 +- docs/README.md | 26 +- docs/_snippets/get-help.mdx | 5 + docs/_snippets/missing-cache-tip.mdx | 14 + docs/_snippets/missing-data-source-tip.mdx | 15 + docs/_snippets/missing-model-tip.mdx | 15 + docs/_snippets/missing-vector-db-tip.mdx | 14 + docs/api-reference/endpoint/create.mdx | 4 - docs/api-reference/endpoint/delete.mdx | 4 - docs/api-reference/endpoint/get.mdx | 4 - docs/api-reference/introduction.mdx | 33 - docs/api-reference/methods/add-loader.mdx | 51 + docs/api-reference/methods/delete-loader.mdx | 44 + docs/api-reference/methods/get-loaders.mdx | 54 + docs/api-reference/methods/query.mdx | 96 ++ docs/api-reference/methods/reset.mdx | 22 + docs/api-reference/methods/search.mdx | 89 ++ docs/api-reference/openapi.json | 195 --- docs/api-reference/overview.mdx | 55 + docs/components/caches/lmdb.mdx | 24 + docs/components/caches/mongodb.mdx | 28 + docs/components/caches/overview.mdx | 21 + docs/components/caches/redis.mdx | 24 + docs/components/data-sources/csv.mdx | 48 + docs/components/data-sources/custom.mdx | 37 + docs/components/data-sources/directory.mdx | 26 + docs/components/data-sources/docx.mdx | 28 + docs/components/data-sources/excel.mdx | 28 + docs/components/data-sources/json.mdx | 27 + docs/components/data-sources/overview.mdx | 27 + docs/components/data-sources/pdf.mdx | 52 + docs/components/data-sources/ppt.mdx | 28 + docs/components/data-sources/sitemap.mdx | 28 + docs/components/data-sources/text.mdx | 21 + docs/components/data-sources/web-page.mdx | 28 + .../data-sources/youtube-channel.mdx | 28 + .../data-sources/youtube-search.mdx | 28 + .../components/data-sources/youtube-video.mdx | 28 + docs/components/embeddings/azure-openai.mdx | 24 + docs/components/embeddings/cohere.mdx | 32 + docs/components/embeddings/ollama.mdx | 27 + docs/components/embeddings/openai.mdx | 36 + docs/components/embeddings/overview.mdx | 17 + docs/components/embeddings/vertexai.mdx | 25 + docs/components/introduction.mdx | 13 + docs/components/llms/anthropic.mdx | 26 + docs/components/llms/azure-openai.mdx | 49 + docs/components/llms/huggingface.mdx | 27 + docs/components/llms/mistral.mdx | 21 + docs/components/llms/ollama.mdx | 25 + docs/components/llms/openai.mdx | 29 + docs/components/llms/overview.mdx | 30 + docs/components/llms/vertexai.mdx | 38 + docs/components/vector-databases/astradb.mdx | 48 + docs/components/vector-databases/hnswlib.mdx | 36 + docs/components/vector-databases/lancedb.mdx | 42 + docs/components/vector-databases/mongodb.mdx | 53 + docs/components/vector-databases/overview.mdx | 21 + docs/components/vector-databases/pinecone.mdx | 52 + docs/components/vector-databases/qdrant.mdx | 36 + docs/components/vector-databases/weaviate.mdx | 36 + docs/contribution/dev.mdx | 39 + docs/contribution/docs.mdx | 28 + docs/contribution/guidelines.mdx | 4 + docs/development.mdx | 98 -- docs/essentials/code.mdx | 37 - docs/essentials/images.mdx | 59 - docs/essentials/markdown.mdx | 88 -- docs/essentials/navigation.mdx | 66 - docs/essentials/reusable-snippets.mdx | 110 -- docs/essentials/settings.mdx | 318 ---- docs/examples/slack_bot.mdx | 36 + docs/favicon.png | Bin 0 -> 80549 bytes docs/favicon.svg | 49 - docs/get-started/faq.mdx | 76 + docs/get-started/introduction.mdx | 62 + docs/get-started/quickstart.mdx | 91 ++ docs/images/hero-dark.svg | 161 -- docs/images/hero-light.svg | 155 -- docs/images/langsmith.png | Bin 0 -> 430753 bytes docs/integration/langsmith.mdx | 60 + docs/introduction.mdx | 71 - docs/logo/dark.svg | 55 - docs/logo/dark.webp | Bin 0 -> 24586 bytes docs/logo/light.svg | 51 - docs/logo/light.webp | Bin 0 -> 23564 bytes docs/mint.json | 286 ++-- docs/product/release-notes.mdx | 4 + docs/quickstart.mdx | 86 -- docs/snippets/snippet-intro.mdx | 4 - docs/use-cases/chatbots.mdx | 23 + docs/use-cases/introduction.mdx | 11 + docs/use-cases/question-answering.mdx | 72 + docs/use-cases/semantic-search.mdx | 104 ++ package-lock.json | 125 +- 111 files changed, 2950 insertions(+), 4665 deletions(-) delete mode 100644 core/embedjs/src/conversation/memory-conversations.ts delete mode 100644 databases/embedjs-mongodb/src/mongo-conversations.ts create mode 100644 docs/_snippets/get-help.mdx create mode 100644 docs/_snippets/missing-cache-tip.mdx create mode 100644 docs/_snippets/missing-data-source-tip.mdx create mode 100644 docs/_snippets/missing-model-tip.mdx create mode 100644 docs/_snippets/missing-vector-db-tip.mdx delete mode 100644 docs/api-reference/endpoint/create.mdx delete mode 100644 docs/api-reference/endpoint/delete.mdx delete mode 100644 docs/api-reference/endpoint/get.mdx delete mode 100644 docs/api-reference/introduction.mdx create mode 100644 docs/api-reference/methods/add-loader.mdx create mode 100644 docs/api-reference/methods/delete-loader.mdx create mode 100644 docs/api-reference/methods/get-loaders.mdx create mode 100644 docs/api-reference/methods/query.mdx create mode 100644 docs/api-reference/methods/reset.mdx create mode 100644 docs/api-reference/methods/search.mdx delete mode 100644 docs/api-reference/openapi.json create mode 100644 docs/api-reference/overview.mdx create mode 100644 docs/components/caches/lmdb.mdx create mode 100644 docs/components/caches/mongodb.mdx create mode 100644 docs/components/caches/overview.mdx create mode 100644 docs/components/caches/redis.mdx create mode 100644 docs/components/data-sources/csv.mdx create mode 100644 docs/components/data-sources/custom.mdx create mode 100644 docs/components/data-sources/directory.mdx create mode 100644 docs/components/data-sources/docx.mdx create mode 100644 docs/components/data-sources/excel.mdx create mode 100644 docs/components/data-sources/json.mdx create mode 100644 docs/components/data-sources/overview.mdx create mode 100644 docs/components/data-sources/pdf.mdx create mode 100644 docs/components/data-sources/ppt.mdx create mode 100644 docs/components/data-sources/sitemap.mdx create mode 100644 docs/components/data-sources/text.mdx create mode 100644 docs/components/data-sources/web-page.mdx create mode 100644 docs/components/data-sources/youtube-channel.mdx create mode 100644 docs/components/data-sources/youtube-search.mdx create mode 100644 docs/components/data-sources/youtube-video.mdx create mode 100644 docs/components/embeddings/azure-openai.mdx create mode 100644 docs/components/embeddings/cohere.mdx create mode 100644 docs/components/embeddings/ollama.mdx create mode 100644 docs/components/embeddings/openai.mdx create mode 100644 docs/components/embeddings/overview.mdx create mode 100644 docs/components/embeddings/vertexai.mdx create mode 100644 docs/components/introduction.mdx create mode 100644 docs/components/llms/anthropic.mdx create mode 100644 docs/components/llms/azure-openai.mdx create mode 100644 docs/components/llms/huggingface.mdx create mode 100644 docs/components/llms/mistral.mdx create mode 100644 docs/components/llms/ollama.mdx create mode 100644 docs/components/llms/openai.mdx create mode 100644 docs/components/llms/overview.mdx create mode 100644 docs/components/llms/vertexai.mdx create mode 100644 docs/components/vector-databases/astradb.mdx create mode 100644 docs/components/vector-databases/hnswlib.mdx create mode 100644 docs/components/vector-databases/lancedb.mdx create mode 100644 docs/components/vector-databases/mongodb.mdx create mode 100644 docs/components/vector-databases/overview.mdx create mode 100644 docs/components/vector-databases/pinecone.mdx create mode 100644 docs/components/vector-databases/qdrant.mdx create mode 100644 docs/components/vector-databases/weaviate.mdx create mode 100644 docs/contribution/dev.mdx create mode 100644 docs/contribution/docs.mdx create mode 100644 docs/contribution/guidelines.mdx delete mode 100644 docs/development.mdx delete mode 100644 docs/essentials/code.mdx delete mode 100644 docs/essentials/images.mdx delete mode 100644 docs/essentials/markdown.mdx delete mode 100644 docs/essentials/navigation.mdx delete mode 100644 docs/essentials/reusable-snippets.mdx delete mode 100644 docs/essentials/settings.mdx create mode 100644 docs/examples/slack_bot.mdx create mode 100644 docs/favicon.png delete mode 100644 docs/favicon.svg create mode 100644 docs/get-started/faq.mdx create mode 100644 docs/get-started/introduction.mdx create mode 100644 docs/get-started/quickstart.mdx delete mode 100644 docs/images/hero-dark.svg delete mode 100644 docs/images/hero-light.svg create mode 100644 docs/images/langsmith.png create mode 100644 docs/integration/langsmith.mdx delete mode 100644 docs/introduction.mdx delete mode 100644 docs/logo/dark.svg create mode 100644 docs/logo/dark.webp delete mode 100644 docs/logo/light.svg create mode 100644 docs/logo/light.webp create mode 100644 docs/product/release-notes.mdx delete mode 100644 docs/quickstart.mdx delete mode 100644 docs/snippets/snippet-intro.mdx create mode 100644 docs/use-cases/chatbots.mdx create mode 100644 docs/use-cases/introduction.mdx create mode 100644 docs/use-cases/question-answering.mdx create mode 100644 docs/use-cases/semantic-search.mdx diff --git a/.prettierignore b/.prettierignore index e26f0b3f..a3a57dca 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,4 +2,5 @@ /dist /coverage /.nx/cache -/.nx/workspace-data \ No newline at end of file +/.nx/workspace-data +*.mdx diff --git a/README.md b/README.md index 0bf37efe..89d58035 100644 --- a/README.md +++ b/README.md @@ -1,1308 +1,30 @@ -# EmbedJs - -

+ EmbedJs Logo

-EmbedJs is an Open Source Framework for personalizing LLM responses. An ultimate toolkit for building powerful Retrieval-Augmented Generation (RAG) and Large Language Model (LLM) applications with ease in Node.js. - -It segments data into manageable chunks, generates relevant embeddings, and stores them in a vector database for optimized retrieval. It enables users to extract contextual information, find precise answers, or engage in interactive chat conversations, all tailored to their own data. - -Here's an example of how easy it is to get started - - -```TS -const ragApplication = await new RAGApplicationBuilder() - .addLoader({ type: 'YoutubeSearch', youtubeSearchString: 'Tesla cars' }) - .addLoader('https://en.wikipedia.org/wiki/Tesla,_Inc.') - .addLoader('https://tesla-info.com/sitemap.xml') - .setVectorDb(new LanceDb({ path: '.db' })) - .build(); -``` - -That's it. Now you can ask questions - - -```TS -console.log(await ragApplication.query('Give me the history of Tesla?')); -``` - -## Features - -- Supports all popular large language models - paid and open source - -- Supports many vector databases including self-hosted and cloud variants. - -- Load different kinds of unstructured data. Comes built in with several loaders that makes this easy. - -- Supports several cache options that can greatly improve the performance of your RAG applications in production. - -- Exposes a simple and highly configureable API allows both quick launch and deep customizabilty. - -- Use just as an embedding engine or a full blown chat API with history - -## Quick note - -The author(s) are looking to add core maintainers for this opensource project. Reach out on [Linkedin](https://www.linkedin.com/in/adhityan/) if you are interested. If you want to contribute in general - create issues on GitHub or send in PRs. - -# Contents - -- [EmbedJs](#embedjs) - - [Features](#features) - - [Quick note](#quick-note) -- [Contents](#contents) -- [Getting started](#getting-started) - - [Installation](#installation) - - [Usage](#usage) - - [Temperature](#temperature) - - [Search results count](#search-results-count) - - [Customize the prompt](#customize-the-prompt) - - [Get context (dry run)](#get-context-dry-run) - - [Delete loader](#delete-loader) - - [Get count of embedded chunks](#get-count-of-embedded-chunks) - - [Remove all embeddings / reset](#remove-all-embeddings--reset) - - [Set cut-off for relevance](#set-cut-off-for-relevance) - - [Add new loaders later](#add-new-loaders-later) - - [Loader inference](#loader-inference) -- [Loaders supported](#loaders-supported) - - [Youtube video](#youtube-video) - - [Youtube channel](#youtube-channel) - - [Youtube search](#youtube-search) - - [PDF file](#pdf-file) - - [Docx file](#docx-file) - - [Excel file](#excel-file) - - [Powerpoint file](#powerpoint-file) - - [Web page](#web-page) - - [Confluence](#confluence) - - [Sitemap](#sitemap) - - [Text](#text) - - [Json](#json) - - [Csv](#csv) - - [Add a custom loader](#add-a-custom-loader) - - [More loaders coming soon](#more-loaders-coming-soon) -- [LLMs](#llms) - - [OpenAI](#openai) - - [Azure OpenAI](#azure-openai) - - [Mistral](#mistral) - - [Hugging Face](#hugging-face) - - [Anthropic](#anthropic) - - [Vertex AI](#vertex-ai) - - [Ollama](#ollama) - - [Use custom LLM model](#use-custom-llm-model) - - [More LLMs coming soon](#more-llms-coming-soon) -- [Embedding models](#embedding-models) - - [OpenAI v3 Small](#openai-v3-small) - - [OpenAI v3 Large](#openai-v3-large) - - [Ada](#ada) - - [Cohere](#cohere) - - [Gecko Embedding](#gecko-embedding) - - [Ollama local embedding](#ollama-local-embedding) - - [Use custom embedding model](#use-custom-embedding-model) - - [More embedding models coming soon](#more-embedding-models-coming-soon) -- [Vector databases supported](#vector-databases-supported) - - [Pinecone](#pinecone) - - [LanceDB](#lancedb) - - [Chroma](#chroma) - - [HNSWLib](#hnswlib) - - [Weaviate](#weaviate) - - [Qdrant](#qdrant) - - [MongoDB (vector database)](#mongodb-vector-database) - - [Astra DB](#astra-db) - - [Bring your own database](#bring-your-own-database) - - [More databases coming soon](#more-databases-coming-soon) -- [Caches](#caches) - - [LMDB](#lmdb) - - [InMemory (cache)](#inmemory-cache) - - [Redis](#redis) - - [MongoDB (cache)](#mongodb-cache) - - [Bring your own cache](#bring-your-own-cache) - - [More caches coming soon](#more-caches-coming-soon) -- [Conversation history](#conversation-history) - - [InMemory (conversation)](#inmemory-conversation) - - [MongoDB (conversation)](#mongodb-conversation) -- [Langsmith Integration](#langsmith-integration) -- [Sample projects](#sample-projects) -- [Contributing](#contributing) - -# Getting started - -## Installation - -You can install the library via NPM or Yarn - -```bash -npm i @llm-tools/embedjs -``` - -## Usage - -To configure a new EmbedJs application, you need to do three steps - - -> **1. Pick an LLM**
-> The library supports several LLMs. Activate one by allowing the instructions in the [LLM](#llms) section. - -```TS -const ragApplication = await new RAGApplicationBuilder() - .setModel(new HuggingFace({ modelName: 'mistralai/Mixtral-8x7B-v0.1' })) - ... -``` - -**Note:** To use the library only for embeddings and not instantiate a LLM, you can pass the string `NO_MODEL` to the setModel function here. This will disable the option to call the `query` function but you can still get the embeddings with the [`getContext`](#get-context-dry-run) method. - -> **2. Pick a Vector database**
-> The library supports several vector databases. Enable one by allowing the instructions in the [Vector Databases](#vector-databases-supported) section. - -```TS - .setVectorDb(new PineconeDb({ projectName: 'test', namespace: 'dev' })) -``` - -> **3. Load some data**
-> The library supports several kinds of loaders. You can use zero, one or many kinds of loaders together to import custom knowledge. Read the [loaders](#loaders-supported) section to learn more about the different supported loaders. - -```TS - .addLoader(new YoutubeSearchLoader({ searchString: 'Tesla cars' })) - .addLoader(new SitemapLoader({ url: 'https://tesla-info.com/sitemap.xml' })) - .build(); -``` - -That's it! Now that you have your instance of `RAGApplication`, you can use it to query against the loaded data sets, like so - - -```TS -await ragApplication.query('What is Tesla?'); -``` - -## Temperature - -The temperature is a number between 0 and 1. It governs the randomness and creativity of the LLM responses. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. You can alter it by - - -```TS -await new RAGApplicationBuilder() -.setTemperature(0.1) -``` - -**NOTE:** The default value is 0.1, which makes the GPT responses very precise. - -## Search results count - -This is the number of documents to aim for when retrieving results from the vector database. A high number of results might mean there is more non-relevant data in the context. A low number might mean none of the relevant documents are retrieved. You need to set the number that works best for you. The parameter can be altered by - - -```TS -await new RAGApplicationBuilder() -.setSearchResultCount(10) -``` - -**NOTE:** The default value is 7. - -It is important to note that the library does not simply dump all contextual document chunks into the prompt. It sends them to the model marking them as context documents. The number of documents still counts toward the token limit. - -When the number of documents fetched leads to a request above the token limit, the library uses the following strategy - - -> It runs a preprocessing step to select relevant sections from each document until the total number of tokens is less than the maximum number of tokens allowed by the model. It then uses the transformed documents as context to answer the question. - -## Customize the prompt - -LLM models need some care. The models are notorious for inventing responses when they don't know the answer. Keeping this in mind, the library auto adds a wrapper to all user queries. The default prompt is - - -> Use all the provided context to answer the query at the end. Answer in full. If you don't know the answer, just say that you don't know, don't try to make up an answer. Query: {0} - -The placeholder `{0}` is replaced with the input query. In some cases, you may want to customize this prompt. This can be done with ease by - - -```TS -await new RAGApplicationBuilder() -.setQueryTemplate('My own query template') -``` - -## Get context (dry run) - -During development, you may want to test the performance and quality of the `Loaders` you have enabled without making any LLM calls. You can do this by using the `getContext` method - - -```TS -await ragApplication.getContext('What is Steve Jobs?') -``` - -## Delete loader - -You can remove the embeddings added from a specific loader by calling the `deleteLoader` method with the uniqueId of the loader. - -```TS -await ragApplication.deleteLoader('uniqueId...', true) -``` - -## Get count of embedded chunks - -You can fetch the count of embeddedings stored in your vector database at any time by calling the `getEmbeddingsCount` method - - -```TS -await ragApplication.getEmbeddingsCount() -``` - -## Remove all embeddings / reset - -You can remove all stored embeddings in the vectorDb using the `deleteAllEmbeddings` method - - -```TS -await ragApplication.deleteAllEmbeddings(true) -``` - -## Set cut-off for relevance - -The library can filter the embeddings returned from a vector store that have a low relevance score to the query being asked. To do this, set the cut-off value using the `setEmbeddingRelevanceCutOff` method - - -```TS -await ragApplication.setEmbeddingRelevanceCutOff(0.23) -``` - -## Add new loaders later - -You can add new loaders at any point dynamically (even after calling the `build` function on `RAGApplicationBuilder`). To do this, simply call the `addLoader` method - - -```TS -await ragApplication.addLoader(new YoutubeLoader({ videoIdOrUrl: 'pQiT2U5E9tI' })); -``` - -**Note:** Do not forget to await the dynamically added loaders to ensure you wait for the load to complete before making queries on it. - -## Loader inference - -You can add most loaders by passing a string to the `addLoader` or the `addLoaders` methods. The value can be a URL, path, JSON or youtube video id. The library will infer the type of content and invoke the appropirate loader automatically. - -```TS -await ragApplication.addLoader('pQiT2U5E9tI'); //invokes youtube URL -await ragApplication.addLoader('https://lamport.azurewebsites.net/pubs/paxos-simple.pdf'); //invokes PDF loader -``` - -**Note:** If you pass the path to a local directory, every file in that directory is recursively added (including subfolders)! - -# Loaders supported - -Loaders take a specific format, process the input and create chunks of the data. You can import all the loaders from the path `@llm-tools/embedjs`. Currently, the library supports the following formats - - -## Youtube video - -To add any youtube video to your app, follow these steps - - -- Install Youtube loader package in your project - -```bash -npm install @llm-tools/embedjs-loader-youtube -``` - -- Now you can use the `YoutubeLoader` - -```TS -.addLoader(new YoutubeLoader({ videoIdOrUrl: 'w2KbwC-s7pY' })) -``` - -## Youtube channel - -To add all videos in a youtube channel, follow these steps - - -- Install Youtube loader package in your project - -```bash -npm install @llm-tools/embedjs-loader-youtube -``` - -- Now you can use the `YoutubeChannelLoader` - -```TS -.addLoader(new YoutubeChannelLoader({ youtubeChannelId: '...' })) -``` - -## Youtube search - -To do a general youtube search and add the popular search results, follow these steps - - -- Install Youtube loader package in your project - -```bash -npm install @llm-tools/embedjs-loader-youtube -``` - -- Now you can use the `YoutubeSearchLoader` - -```TS -.addLoader(new YoutubeSearchLoader({ youtubeSearchString: '...' })) -``` - -## PDF file - -To add a pdf file, use `PdfLoader`. To get started, install the PdfLoader addon - - -```bash -npm install @llm-tools/embedjs-loader-pdf -``` - -Now, you can add a local file - - -```TS -.addLoader(new PdfLoader({ filePathOrUrl: path.resolve('paxos-simple.pdf') })) -``` - -Or, you can add a remote file - - -```TS -.addLoader(new PdfLoader({ url: 'https://lamport.azurewebsites.net/pubs/paxos-simple.pdf' })) -``` - -**Note:** Currently there is no support for PDF forms and password protected documents - -## Docx file - -To add a docx file, use `DocxLoader`. To get started, install the MSOffice loader addon - - -```bash -npm install @llm-tools/embedjs-loader-msoffice -``` - -Now, you can add a local file - - -```TS -.addLoader(new DocxLoader({ filePathOrUrl: path.resolve('paxos.docx') })) -``` - -Or, you can add a remote file - - -```TS -.addLoader(new DocxLoader({ filePathOrUrl: 'https://xxx' })) -``` - -## Excel file - -To add an excel xlsx file, use `ExcelLoader`. To get started, install the MSOffice loader addon - - -```bash -npm install @llm-tools/embedjs-loader-msoffice -``` - -Now, you can add a local file - - -```TS -.addLoader(new ExcelLoader({ filePathOrUrl: path.resolve('numbers.xlsx') })) -``` - -Or, you can add a remote file - - -```TS -.addLoader(new ExcelLoader({ filePathOrUrl: 'https://xxx' })) -``` - -## Powerpoint file - -To add an powerpoint / pptx file, use `PptLoader`. To get started, install the MSOffice loader addon - - -```bash -npm install @llm-tools/embedjs-loader-msoffice -``` - -Now, you can add a local file - - -```TS -.addLoader(new PptLoader({ filePathOrUrl: path.resolve('wow.pptx') })) -``` - -Or, you can add a remote file - - -```TS -.addLoader(new PptLoader({ filePathOrUrl: 'https://xxx' })) -``` - -## Web page - -To add a web page, follow these steps - - -- Install Web loader addon in your project - -```bash -npm install @llm-tools/embedjs-loader-web -``` - -- Now you can use the `WebLoader` - -```TS -.addLoader(new WebLoader({ urlOrContent: 'https://en.wikipedia.org/wiki/Formula_One' })) -``` - -## Confluence - -To add a confluence space, follow these steps - - -- Install the Confluence loader addon in your project - -```bash -npm install @llm-tools/embedjs-loader-confluence -``` - -- set the following environment variables - - -```bash -CONFLUENCE_BASE_URL= -CONFLUENCE_USER_NAME= -CONFLUENCE_API_TOKEN= -``` - -**Note:** The confluence space name is the value you see in the url in the space overview page `/wiki/spaces/{{ space name }}/overview`. - -- Now you can use the `ConfluenceLoader` - -```TS -.addLoader(new ConfluenceLoader({ spaceNames: ['...'] })) -``` - -## Sitemap - -To add a XML sitemap, follow these steps - - -- Install the Sitemap loader addon in your project - -```bash -npm install @llm-tools/embedjs-loader-sitemap -``` - -- Now you can use the `SitemapLoader` - -```TS -.addLoader(new SitemapLoader({ url: '...' })) -``` - -This will load all URLs in a sitemap via the WebLoader. - -## Text - -To supply your own text, use `TextLoader`. - -```TS -.addLoader(new TextLoader({ text: 'The best company name for a company making colorful socks is MrSocks' })) -``` - -**Note:** Feel free to add your custom text without worrying about duplication. The library will chuck, cache and update the vector databases without duplication. - -## Json - -To add a parsed Javascript object to your embeddings, use `JsonLoader`. The library will not parse a string to JSON on its own but once this is done, it can be injested easily. - -```TS -.addLoader(new JsonLoader({ object: { key: value, ... } })) -``` - -**Note:** if you want to restrict the keys that get added to the vectorDb in a dynamically obtained object, you can use the `pickKeysForEmbedding` optional parameter in the `JsonLoader` constructor. - -## Csv - -To add a Csv file (or URL) to your embeddings, use `CsvLoader`. The library will parse the Csv and add each row to its vector database. To get started, follow these steps - - -- Install the Csv loader addon in your project - -```bash -npm install @llm-tools/embedjs-loader-csv -``` - -- Now you can use the `CsvLoader` like so - - -```TS -.addLoader(new CsvLoader({ filePathOrUrl: '...' })) -``` - -**Note:** You can control how the `CsvLoader` parses the file in great detail by passing in the optional `csvParseOptions` constructor parameter. - -## Add a custom loader - -You can pass along a custom loader to the `addLoader` method by extending and implementing the abstract class `BaseLoader`. Here's how that would look like - - -```TS -class CustomLoader extends BaseLoader<{ customChunkMetadata: string }> { - constructor() { - super('uniqueId'); - } - - async *getChunks() { - throw new Error('Method not implemented.'); - } -} -``` - -We really encourage you send in a PR to this library if you are implementing a common loader pattern, so the community can benefit from it. - -## More loaders coming soon - -If you want to add any other format, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will add it to the list of supported formats. All PRs are welcome. - -# LLMs - -It's relatively easy to switch between different LLMs using the library. You can import any of the LLMs from the path `@llm-tools/embedjs`. We support the following LLMs today - - -## OpenAI - -To use the OpenAI LLM models, you need a API key from OpenAI. You can alternatively use Azure OpenAI to run these models. Read the [Azure OpenAI](#azure-openai) section below to learn more about this. In this section, we will cover how to use OpenAI provided LLMs. - -The first step is to obtain an API Key from OpenAI. You can do this by visiting their [API Portal](https://platform.openai.com/api-keys). Once you obtain a key, set it as an environment variable, like so - - -```bash -OPENAI_API_KEY="" -``` - -Next, you need to install the OpenAI addon - - -```bash -npm install @llm-tools/embedjs-openai -``` - -Once these two steps are done, it is relatively easy to run OpenAI LLMs. All you need is to indicate the model type you want to run. - -- For GPT 3.5 Turbo - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(SIMPLE_MODELS.OPENAI_GPT3_TURBO) -``` - -- For GPT 4 - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(SIMPLE_MODELS.OPENAI_GPT4) -``` - -- To use a custom model name - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new OpenAi({ modelName: 'gpt-4' })) -``` - -**Note:** GPT 3.5 Turbo is used as the default model if you do not specifiy one. - -## Azure OpenAI - -In order to be able to use an OpenAI model on Azure, it first needs to be deployed. Please refer to [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/) on how to deploy a model on Azure. To run this library, you will need to deploy two models - - -- text-embedding-ada (or any of the newer models) -- GPT-3.5-turbo (or the 4 series) - -Once these models are deployed, using Azure OpenAI instead of the regular OpenAI is easy to do. Just follow these steps - - -- Remove the `OPENAI_API_KEY` environment variable if you have set it already. - -- Set the following environment variables - - -```bash -# Set this to `azure` -OPENAI_API_TYPE=azure -# The API version you want to use -AZURE_OPENAI_API_VERSION=2023-05-15 -# The base URL for your Azure OpenAI resource. You can find this in the Azure portal under your Azure OpenAI resource. -export AZURE_OPENAI_BASE_PATH=https://your-resource-name.openai.azure.com/openai/deployments -# The API key1 or key2 for your Azure OpenAI resource -export AZURE_OPENAI_API_KEY= -# The deployment name you used for your embedding model -AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME=text-embedding-ada-002 -# The deployment name you used for your llm -AZURE_OPENAI_API_DEPLOYMENT_NAME=gpt-35-turbo -``` - -You are now all set and can now run the Azure OpenAI LLMs using the [`OpenAi` model](#openai) steps detailed above. - -## Mistral - -To use Mirstal's models, you will need to get an API Key from Mistral. You can do this from their [console](https://console.mistral.ai/user/api-keys/). Next, you need to install the Mistral addon to embedJs - - -```bash -npm install @llm-tools/embedjs-mistral -``` - -Once these steps are complete, set Mistral as your LLM of choice - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Mistral({ accessToken: "" })) -``` - -By default, the `mistral-medium` model from Mistral is used. If you want to use a different Mistral model, you can specify it via the optional parameter to the Mistral constructor, like so - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Mistral({ accessToken: "", modelName: "..." })) -``` - -**Note:** If you want to run Mistral open source for free, you can do so using the HuggingFace platform (read below). Just make sure to set the modelName to `mistralai/Mistral-7B-v0.1` or the version you want to run. - -## Hugging Face - -Hugging face needs no introduction. They host a variety of open source LLMs and you can use most of them for free. To run hugging face inference based LLMs with this library, you will need a free hugging face token. - -You can get an API Token by signing up for hugging face and generate a token from [this page](https://huggingface.co/settings/tokens). Once you get the token, set it to the environment like so - - -```bash -HUGGINGFACEHUB_API_KEY="" -``` - -Next you need to install the hugging face addon for embedJs - - -```bash -npm install @llm-tools/embedjs-huggingface -``` - -That's all, now you can use any of the hugging face models. To do this set `HuggingFace` as your model processor of choice - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new HuggingFace({ modelName: "..." }))) -``` - -**Note:** Not all hugging face models are fully free to consume via their API. Since running these models takes a lot of resources, Hugging Face charges a fee for a few of the larger ones. This is the case with Meta's `meta-llama/Llama-2-7b-hf`, for example. - -To use these 'not-free' models via HuggingFace, you need to subscribe to their [Pro plan](https://huggingface.co/pricing) or create a custom [inference endpoint](https://ui.endpoints.huggingface.co/). It is possible to self host these models for free and run them locally via Ollama - support for which is coming soon. - -## Anthropic - -To use Anthropic's Claude models, you will need to get an API Key from Anthropic. You can do this from their [console](https://console.anthropic.com/settings/keys). Once you obtain a key, set it in the environment variable, like so - - -```bash -ANTHROPIC_API_KEY="" -``` - -Next, you need to install the Anthropic extension for embedJs like so - - -```bash -npm install @llm-tools/embedjs-anthropic -``` - -Once these are done, it is relatively easy to use Anthropic's Claude in your RAG application. Simply set Anthropic as your LLM of choice - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Anthropic()) -``` - -By default, the `claude-3-sonnet-20240229` model from Anthropic is used. If you want to use a different Anthropic model, you can specify it via the optional parameter to the Anthropic constructor, like so - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Anthropic({ modelName: "..." })) -``` - -You can read more about the various models provided by Anthropic [here](https://docs.anthropic.com/claude/docs/models-overview). - -## Vertex AI - -You to use Gemini LLM and other models on Google Cloud Platform via [VertexAI](https://cloud.google.com/vertex-ai?hl=en). Read more about all the supported [LLMs](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models). - -To get started, you need to set the right access credentials to google cloud. You have two options here - - -- Authenticate by using `gcloud` CLI: - -``` -gcloud auth application-default login -``` - -- Authentication using Service Account with JSON key and environment variable: - -```bash -GOOGLE_APPLICATION_CREDENTIALS="" -``` - -- Install the vertex ai addon for embedJs - -```bash -npm install @llm-tools/embedjs-vertexai -``` - -Now all you need to do is set the model to `VertexAI`. Here's an example - - -```TS -const ragApplication = await new RAGApplicationBuilder() - .setModel(new VertexAI({ modelName: 'gemini-1.5-pro-preview-0409'})) - .setEmbeddingModel(new GeckoEmbedding()) -``` - -See also `/examples/vertexai` for [further documentation](/examples/vertexai/README.md) about authentication options and how to use it. - -**Note:** Default model is `gemini-1.0-pro`. - -## Ollama - -You can also use locally running Ollama models. Installation instructions for Ollama can be found [here](https://ollama.com/). - -Once Ollama is installed, you can start a local LLM by executing `ollama run `. Next to be able to use Ollama in embedJs, install the Ollama addon - - -```bash -npm install @llm-tools/embedjs-ollama -``` - -Once this is done, you can use that in the `Ollama` constructor by passing the `modelName` parameter. Here's an example - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Ollama({ - modelName: "llama3", - baseUrl: 'http://localhost:11434' -})) -``` - -**Note:** Default port in which Ollama runs, is `11434`, but if for some reason you use something else, you can pass `baseUrl` with the port number as the second argument: - -## Use custom LLM model - -You can use a custom LLM model by implementing the `BaseModel` interface. Here's how that would look like - - -```TS -class MyOwnLLMImplementation implements BaseModel { - override async init(): Promise {} //optional to override - - protected abstract runQuery( - system: string, //the system prompt - userQuery: string, //the current user query - supportingContext: Chunk[], //all supporting documents - pastConversations: ConversationHistory[], //the chat history so far - ): Promise { - throw new Error("Method not implemented."); - } -} -``` - -Once done, you can pass this class to the `setModel` method like shown in the examples above. That said, we really encourage you send in a PR to this library if you are implementing a famous or common LLM, so the community can benefit from it. - -## More LLMs coming soon - -If you want us to add support for a specific LLM, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will prioritize it. All PRs are welcome. - -Currently, we next plan to add support for Ollama. - -# Embedding models - -Embedding models are LLMs that convert a string into vector better suited for processing. In most cases, the default `text-embedding-3-small` model from OpenAI is going to be good enough. If you want to use this model, you do not have to do anything extra. - -However in some advanced cases, you may want to change this; after all, different embedding models perform differently under different curcumstances. The library allows you to do this using the method `setEmbeddingModel` while building the `RAGApplication`. - -The library supports the following embedding models - - -## OpenAI v3 Small - -The `text-embedding-3-small` is a new standard embedding model released by OpenAI in Jan, 2024. It is the default used by the libary. This model is cheaper and better than their older Ada model. This model returns vectors with dimension 1536. - -You do not have to do anything to enable it. - -## OpenAI v3 Large - -The `text-embedding-3-large` is also a new standard embedding model released by OpenAI in Jan, 2024. This model is the best embedding model provided by OpenAI as of now but is also the most expensive. This model returns vectors with dimension 3072. - -To set it as your model of choice - - -- Set `OpenAi3LargeEmbeddings` as your embedding model on `RAGApplicationBuilder` - -```TS -import { OpenAi3LargeEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new OpenAi3LargeEmbeddings()) -``` - -## Ada - -The `text-embedding-ada-002` is a well known model from OpenAI. You can read more about it [here](https://openai.com/blog/new-and-improved-embedding-model). This model returns vectors with dimension 1536. - -To set it as your model of choice - - -- Set `AdaEmbeddings` as your embedding model on `RAGApplicationBuilder` - -```TS -import { AdaEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new AdaEmbeddings()) -``` - -## Cohere - -The library supports usage of [Cohere-AI](https://cohere.com) `embed-english-v2.0` embedding model out of the box. This model returns vectors with dimension 4096. - -Here's what you have to do to enable it - - -- Sign up for an account with Cohere-AI if you have not done so already. Once done, go to the [API Keys](https://dashboard.cohere.ai/api-keys) section and copy an API_KEY. - -- Load the key you just obtained in the environment variable `COHERE_API_KEY` - -```bash -COHERE_API_KEY="" -``` - -- Set `CohereEmbeddings` as your embedding model on `RAGApplicationBuilder` - -```TS -import { CohereEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new CohereEmbeddings()) -``` - -## Gecko Embedding - -The libaray supports the embedding model `textembedding-gecko` with 768 dimensions on [VertexAI](https://cloud.google.com/vertex-ai/generative-ai/docs/embeddings/get-text-embeddings). - -To use this, you can authenticate to Vertex AI on GCP. Refer [here](#vertex-ai) on how to do this. Once done, simply set `GeckoEmbedding` as your choice of embedding model, like so - - -```TS -import { GeckoEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new GeckoEmbeddings()) -``` - -For an example usage of GeckoEmbeddings with Gemini LLM on VertexAI check the folder `/examples/vertexai/`. - -## Ollama local embedding - -The libaray supports fully local embeddings via `Ollama`. Read more here [Ollama embeddings](https://ollama.com/blog/embedding-models). - -To use this, you need to setup and have Ollama working locally. Refer to their Github [here](https://github.com/ollama/ollama) to understand how to do this. Once done, simply set `OllamaEmbeddings` as your choice of embedding model, like so - - -```TS -import { OllamaEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new OllamaEmbeddings({ - model: '...', - baseUrl: '...' -})) -``` - -## Use custom embedding model - -You can use your own custom embedding model by implementing the `BaseEmbeddings` interface. Here's how that would look like - - -```TS -class MyOwnEmbeddingImplementation implements BaseEmbeddings { - embedDocuments(texts: string[]): Promise { - throw new Error("Method not implemented."); - } - - embedQuery(text: string): Promise { - throw new Error("Method not implemented."); - } - - getDimensions(): number { - throw new Error("Method not implemented."); - } -} -``` - -Once done, you can pass this class to the `setEmbeddingModel` method like shown in the Cohere example above. That said, we really encourage you send in a PR to this library if you are implementing a famous or common embedding provider, so the community can benefit from it. - -## More embedding models coming soon - -If you want us to add support for a specific embedding model, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will prioritize it. All PRs are welcome. - -# Vector databases supported - -The library allows you to save your processed and unique embeddings with the vector databases of your choice. Here are the supported databases right now - - -## Pinecone - -You can enable Pinecone storage by following these steps - - -- Create an account with [Pinecone](https://www.pinecone.io/) if you don't have one already. There is a _good free tier_. - -- Install pinecone package in your project - -```bash -npm install @pinecone-database/pinecone -``` - -- Set the pinecone environment variable `PINECONE_API_KEY`. This can be obtained from the **API Keys** section on the Pinecone dashboard. - -```bash -PINECONE_API_KEY= -``` - -- Set the Pinecone database as your choice of `vectorDb` - -```TS -import { PineconeDb } from '@llm-tools/embedjs/vectorDb/pinecone'; - -.setVectorDb(new PineconeDb({ - projectName: 'test', - namespace: 'dev', - indexSpec: { - pod: { - podType: 'p1.x1', - environment: 'us-east1-gcp', - }, - }, -})) -``` - -**Note:** Pinecone supports serverless and pod based index deployments. You can control how you want your index created using the indexSpec attribute. This is mandatory to be provided but comes with full type specification. Read more about configuring this [here](https://github.com/pinecone-io/pinecone-ts-client/blob/main/v2-migration.md). - -## LanceDB - -[LanceDB](https://lancedb.com/) is a local vector database with great performance. Follow these steps to use LanceDB as your vector database - - -- Install LanceDb package in your project - -```bash -npm install @lancedb/lancedb -``` - -- Set LanceDB database as your choice of `vectorDb` - -```TS -import { LanceDb } from '@llm-tools/embedjs/vectorDb/lance'; - -.setVectorDb(new LanceDb({ path: path.resolve('/db') })) -``` - -**Note:** The `path` property will be used by LanceDB to create a directory to host all the database files. There is also support for creating temporary directories for testing - - -```TS -import { LanceDb } from '@llm-tools/embedjs/vectorDb/lance'; - -.setVectorDb(new LanceDb({ path: 'lance-', isTemp: true })) -``` - -In this case, the `path` property is used as a prefix to create the temporary directory in the OS temp directory folder. - -## Chroma - -**Note:** The chroma addon is currently not published / supported. There are some type issues in the upstream dependencies that are being resolved. - -[Chroma](https://trychroma.com/) is an open source vector database. It's designed to be Python first and to connect to it from NodeJS, you will need to run Chroma in a container following the steps [listed here](https://docs.trychroma.com/deployment). Once done, follow these steps to use Chroma as your vector database - - -- Install Chroma package in your project - -```bash -npm install chromadb -``` - -- Set Chroma database as your choice of `vectorDb` - -```TS -import { ChromaDb } from '@llm-tools/embedjs/vectorDb/chroma'; - -.setVectorDb(new ChromaDb({ url: 'http://localhost:8000' })) -``` - -**Note:** This is the default url and port if you run the Chroma docker container using the command `docker-compose up -d --build`. - -A warning - - -> In our testing, chroma performed the poorest in being able to retrieve relevant documents among the supported vector databases. - -## HNSWLib - -[HNSWLib](https://github.com/nmslib/hnswlib) is an in-memory vectorstore. It is great for beginners to get started with since you do not need access to the file system or a cloud service. Follow these steps to use HNSWLib as your vector database - - -- Install HNSWLib package in your project - -```bash -npm install hnswlib-node -``` - -- Set HNSWLib database as your choice of `vectorDb` - -```TS -import { HNSWDb } from '@llm-tools/embedjs/vectorDb/hnswlib'; - -.setVectorDb(new HNSWDb()) -``` - -**Note:** This is a purely in-memory vector store. All values are lost when application is restarted. - -## Weaviate - -[Weaviate](https://weaviate.io/) is an open source vector store. You can deploy it locally on docker or use their managed cloud offering. Follow these steps to use Weaviate as your vector database - - -- Install Weaviate package in your project - -```bash -npm install weaviate-ts-client -``` - -- Set Weaviate database as your choice of `vectorDb` - -```TS -import { WeaviateDb } from '@llm-tools/embedjs/vectorDb/weaviate'; - -.setVectorDb(new WeaviateDb({ host: '...', apiKey: '...', className: '...', scheme: '...' })) -``` - -## Qdrant - -[Qdrant](https://qdrant.tech/) is an Open-Source Vector Database and Vector Search Engine written in Rust. To use it - - -- Install Qdrant package in your project - -```bash -npm install @qdrant/js-client-rest -``` - -- Set Qdrant database as your choice of `vectorDb` - -```TS -import { QdrantDb } from '@llm-tools/embedjs/vectorDb/qdrant'; - -.setVectorDb(new QdrantDb({ apiKey: '...'; url: '...'; clusterName: '...' })) -``` - -## MongoDB (vector database) - -[MongoDB](https://www.mongodb.com/products/platform/atlas-vector-search) is an open source document database. They offer a managed cloud offering **MongoDB Atlas**. As of right now, only the Atlas version supports vector search while the open source version does not. - -To use MongoDB as your vector database, follow these steps - - -- Sign up for a MongoDB Atlas account if you haven't already. Once you have signed up, you will need to spin up a new cluster (or use an existing one) - -**Note:** you will need to provision a M10 (or higher) instance type to use Atlas vector search. Cheaper instance types or the free version (M0) give an error when vector indexes are created programatically. - -- The cluster creation takes a few minutes. Once the cluster is ready, click on the connect button on the dashboard to get the connection string. - -**Note:** You will need to add a users separately and allow IP access from your relevant development and production environments. - -- Install mongodb package in your project - -```bash -npm install mongodb -``` - -- Set MongoDB database as your choice of `vectorDb` - -```TS -import { MongoDb } from '@llm-tools/embedjs/vectorDb/mongodb'; - -.setVectorDb( - new MongoDb({ - connectionString: 'mongodb+srv://:@', - }), -) -``` - -**Note:** you can also optionally configure the database and collection name the library will use with the constructor parameters `dbName` and `collectionName`. Default values are used if these are not provided. - -## Astra DB - -[Astra DB is a document database with a highly performant vector index](https://www.datastax.com/products/datastax-astra) powered by Apache Cassandra and available as a managed service. - -To use Astra DB as your vector database follow these steps: - -- [Sign up for an Astra DB account](https://astra.datastax.com/signup). It is free to sign up and doesn't require a credit card. -- Create a database (this takes a couple of minutes to provision) -- From the database overview page get the API Endpoint and generate an Application Token -- Install the Astra DB package in your project: - ```bash - npm install @datastax/astra-db-ts - ``` -- Set Astra DB as your choice of `vectorDb` - - ```TS - import { AstraDb } from '@llm-tools/embedjs/vectorDb/astra-db' - - .setVectorDb( - new AstraDb({ - endpoint: process.env.ASTRA_DB_API_ENDPOINT, - apiKey: process.env.ASTRA_DB_APP_TOKEN, - collectionName: "documents" - }), - ) - ``` - -## Bring your own database - -You can pass along your vector database to the `setVectorDb` method by implementing the interface `BaseDb`. Here's how that would look like - - -```TS -class MyOwnDb implements BaseDb { - async init({ dimensions }: { dimensions: number }): Promise { - throw new Error('Method not implemented.'); - } - - async insertChunks(chunks: EmbeddedChunk[]): Promise { - throw new Error('Method not implemented.'); - } - - async similaritySearch(query: number[], k: number): Promise { - throw new Error('Method not implemented.'); - } - - async getVectorCount(): Promise { - throw new Error('Method not implemented.'); - } - - async deleteKeys(keys: string[]): Promise { - throw new Error('Method not implemented.'); - } - - async reset(): Promise { - throw new Error('Method not implemented.'); - } -} -``` - -We really encourage you send in a PR to this library if you are implementing a famous or common database, so the community can benefit from it. - -## More databases coming soon - -If you want to add support for any other vector database, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will add it to the list of supported databases. All PRs are welcome. - -# Caches - -Caches serve to reduce re-processing embeddings, loaders and queries. There is no need to load, chunk and store a large PDF File or web page on every run. Caching smartly is built in and can be enabled out of the box simply by setting a cache processor using the method `setCache` while building the `RAGApplication`. - -The library supports the following caches - - -## LMDB - -You can use [LMDB](https://dbdb.io/db/lmdb) to cache values locally on disk. - -- Install LMDB package in your project - -```bash -npm install lmdb -``` - -- Set `LmdbCache` as your cache provider on `RAGApplicationBuilder` - -```TS -import { LmdbCache } from '@llm-tools/embedjs/cache/lmdb'; - -await new RAGApplicationBuilder() -.setCache(new LmdbCache({ path: path.resolve('./cache') })) -``` - -**Note:** The `path` property will be used by the LMDB driver to create a folder housing the LMDB database files. - -## InMemory (cache) - -You can use a simple in-memory cache to store values during testing. - -- Set `MemoryCache` as your cache provider on `RAGApplicationBuilder` - -```TS -import { MemoryCache } from '@llm-tools/embedjs/cache/memory'; - -await new RAGApplicationBuilder() -.setCache(new MemoryCache()) -``` - -**Note:** Although this cache can remove duplicate loaders and chunks, its store does not persist between process restarts. You should only be using it for testing. - -## Redis - -You can use redis as a cache to store values. - -- Set `RedisCache` as your cache provider on `RAGApplicationBuilder` - -```TS -import { RedisCache } from '@llm-tools/embedjs/cache/redis'; - -await new RAGApplicationBuilder() -.setCache(new RedisCache({ ... })) -``` - -**Note:** The library internally uses `IORedis` to work with redis. `RedisCache` constructor supports all `IORedis` constructor parameters. Check [`IORedis` documentation](https://github.com/redis/ioredis) for more detials. - -## MongoDB (cache) - -You can use a MongoDB as a cache to cache values. - -- Set `MongoCache` as your cache provider on `RAGApplicationBuilder` - -```TS -import { MemoryCache } from '@llm-tools/embedjs/cache/mongo'; - -await new RAGApplicationBuilder() -.setCache(new MongoCache({ ... })) -``` - -## Bring your own cache - -You can pass along your own cache provider to the `setCache` method by implementing the interface `BaseCache`. Here's how that would look like - - -```TS -class MyOwnCache implements BaseCache { - async init(): Promise { - throw new Error("Method not implemented."); - } - - async addLoader(loaderId: string, chunkCount: number ): Promise { - throw new Error("Method not implemented."); - } - - async getLoader(loaderId: string): Promise<{ chunkCount: number }> { - throw new Error("Method not implemented."); - } - - async hasLoader(loaderId: string): Promise { - throw new Error("Method not implemented."); - } -} -``` - -We really encourage you send in a PR to this library if you are implementing a famous or common cache provider, so the community can benefit from it. - -## More caches coming soon - -If you want to add support for any other cache providers, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will add it to the list of supported caches. All PRs are welcome. - -# Conversation history - -EmbedJS allows the addition of various storage layers for conversations. This allows the conversation history to be stored and made persistant between sessions. Like all other aspects of embedJS there is a base interface for conversations and you can create your own conversation history implementation. - -The library supports the following conversation history types out of the box - - -## InMemory (conversation) - -You can use a simple in-memory object to store conversation history during testing. This is the default activated conversation history manager if you don't specify anything else. This cache is used by **default** if no other cache is specified. - -- Set `InMemoryConversation` as your cache provider on `RAGApplicationBuilder` - -```TS -import { MemoryConversations } from '@llm-tools/embedjs/conversation/memory'; - -await new RAGApplicationBuilder() -.setConversationEngine(new InMemoryConversation()) -``` - -**Note:** Although this cache does remove duplicate loaders and chunks, its store does not persist between process restarts. - -## MongoDB (conversation) - -Can be used with any version of MongoDb. - -- Set `MongoConversation` as your cache provider on `RAGApplicationBuilder` - -```TS -import { MongoConversation } from '@llm-tools/embedjs/conversation/mongo'; - -await new RAGApplicationBuilder() -.setConversationEngine(new MongoConversations({ - uri: MONGODB_URI, - dbName: DB_NAME, - collectionName: CONVERSATIONS_COLLECTION_NAME -});) -``` +

+ License + NPM Version +

-# Langsmith Integration +
-Langsmith allows you to keep track of how you use LLM and embedding models. It logs histories, token uses and other metadata. Follow these three simple steps to enable - +## What is EmbedJs? -- Sign up for an account with [Langsmith](https://smith.langchain.com/) -- Generate an API Key from your admin page -- Set the following environment keys in your project +EmbedJs is an Open Source Framework for personalizing LLM responses. An ultimate toolkit for building powerful Retrieval-Augmented Generation (RAG) and Large Language Model (LLM) applications with ease in Node.js. -```bash -export LANGCHAIN_TRACING_V2=true -export LANGCHAIN_ENDPOINT="https://api.smith.langchain.com" -export LANGCHAIN_PROJECT="" -export LANGCHAIN_API_KEY="" -``` +It segments data into manageable chunks, generates relevant embeddings, and stores them in a vector database for optimized retrieval. It enables users to extract contextual information, find precise answers, or engage in interactive chat conversations, all tailored to their own data. -# Sample projects +## 📖 Documentation -Here's a list of projects / examples built with RagKit +Comprehensive guides and API documentation are available to help you get the most out of EmbedJs: -| **Project** | **Description** | -| ------------------------------------------------------------ | ---------------------------------------------------------------------- | -| [slack-bot](https://github.com/llm-tools/slack-bot-template) | A NestJs based slack bot that can answer questions based on confluence | +- [Introduction](https://llm-tools.mintlify.app/get-started/introduction#what-is-embedjs) +- [Getting Started](https://llm-tools.mintlify.app/get-started/quickstart) +- [Supported data types](https://llm-tools.mintlify.app/components/data-sources/overview) +- [Examples](https://llm-tools.mintlify.app/examples) -# Contributing +## 🌐 Contributing Contributions are welcome! Please check out the issues on the repository, and feel free to open a pull request. For more information, please see the [contributing guidelines](CONTRIBUTING.md). diff --git a/core/embedjs-interfaces/src/index.ts b/core/embedjs-interfaces/src/index.ts index f23f0b1d..2a00fca9 100644 --- a/core/embedjs-interfaces/src/index.ts +++ b/core/embedjs-interfaces/src/index.ts @@ -3,8 +3,7 @@ import { BaseDb } from './interfaces/base-db.js'; import { BaseEmbeddings } from './interfaces/base-embeddings.js'; import { BaseCache } from './interfaces/base-cache.js'; import { BaseModel } from './interfaces/base-model.js'; -import { BaseConversation } from './interfaces/base-conversations.js'; export * from './types.js'; export * from './constants.js'; -export { BaseDb, BaseCache, BaseLoader, BaseEmbeddings, BaseModel, BaseConversation }; +export { BaseDb, BaseCache, BaseLoader, BaseEmbeddings, BaseModel }; diff --git a/core/embedjs-interfaces/src/interfaces/base-cache.ts b/core/embedjs-interfaces/src/interfaces/base-cache.ts index 662c7cb2..059d97ae 100644 --- a/core/embedjs-interfaces/src/interfaces/base-cache.ts +++ b/core/embedjs-interfaces/src/interfaces/base-cache.ts @@ -1,3 +1,5 @@ +import { Conversation, Message } from '../types.js'; + export interface BaseCache { init(): Promise; addLoader(loaderId: string, chunkCount: number): Promise; @@ -9,4 +11,11 @@ export interface BaseCache { loaderCustomGet>(loaderCombinedId: string): Promise; loaderCustomHas(loaderCombinedId: string): Promise; loaderCustomDelete(loaderCombinedId: string): Promise; + + addConversation(conversationId: string): Promise; + getConversation(conversationId: string): Promise; + hasConversation(conversationId: string): Promise; + deleteConversation(conversationId: string): Promise; + addEntryToConversation(conversationId: string, entry: Message): Promise; + clearConversations(): Promise; } diff --git a/core/embedjs-interfaces/src/interfaces/base-conversations.ts b/core/embedjs-interfaces/src/interfaces/base-conversations.ts index 2c300fdb..cec96e8f 100644 --- a/core/embedjs-interfaces/src/interfaces/base-conversations.ts +++ b/core/embedjs-interfaces/src/interfaces/base-conversations.ts @@ -1,11 +1,3 @@ -import { Conversation, Message } from '../types.js'; - export interface BaseConversation { init(): Promise; - addConversation(conversationId: string): Promise; - getConversation(conversationId: string): Promise; - hasConversation(conversationId: string): Promise; - deleteConversation(conversationId: string): Promise; - addEntryToConversation(conversationId: string, entry: Message): Promise; - clearConversations(): Promise; } diff --git a/core/embedjs-interfaces/src/interfaces/base-loader.ts b/core/embedjs-interfaces/src/interfaces/base-loader.ts index 04e4f1e3..b042cafe 100644 --- a/core/embedjs-interfaces/src/interfaces/base-loader.ts +++ b/core/embedjs-interfaces/src/interfaces/base-loader.ts @@ -9,13 +9,13 @@ export abstract class BaseLoader< T extends Record = Record, M extends Record = Record, > extends EventEmitter { - private static cache?: Pick< + private static cache: Pick< BaseCache, 'loaderCustomDelete' | 'loaderCustomGet' | 'loaderCustomHas' | 'loaderCustomSet' >; private static readonly LOADERS_LIST_CACHE_KEY = 'LOADERS_LIST_CACHE_KEY'; - public static setCache(cache?: BaseCache) { + public static setCache(cache: BaseCache) { BaseLoader.cache = cache; } @@ -72,9 +72,9 @@ export abstract class BaseLoader< constructor( uniqueId: string, loaderMetadata: Record, - chunkSize: number = 5, - chunkOverlap: number = 0, - canIncrementallyLoad: boolean = false, + chunkSize = 5, + chunkOverlap = 0, + canIncrementallyLoad = false, ) { super(); @@ -87,6 +87,7 @@ export abstract class BaseLoader< createDebugMessages('embedjs:loader:BaseLoader')(`New loader class initalized with key ${uniqueId}`); } + // eslint-disable-next-line @typescript-eslint/no-empty-function public async init(): Promise {} public get canIncrementallyLoad() { diff --git a/core/embedjs-interfaces/src/interfaces/base-model.ts b/core/embedjs-interfaces/src/interfaces/base-model.ts index 0d6ce799..c4b2f517 100644 --- a/core/embedjs-interfaces/src/interfaces/base-model.ts +++ b/core/embedjs-interfaces/src/interfaces/base-model.ts @@ -1,21 +1,21 @@ import createDebugMessages from 'debug'; import { v4 as uuidv4 } from 'uuid'; -import { BaseConversation } from './base-conversations.js'; import { Chunk, QueryResponse, Message, SourceDetail, ModelResponse } from '../types.js'; +import { BaseCache } from './base-cache.js'; export abstract class BaseModel { private readonly baseDebug = createDebugMessages('embedjs:model:BaseModel'); - private static conversations: BaseConversation; + private static cache: BaseCache; private static defaultTemperature: number; public static setDefaultTemperature(temperature?: number) { BaseModel.defaultTemperature = temperature; } - public static setConversations(conversations: BaseConversation) { - BaseModel.conversations = conversations; + public static setCache(cache: BaseCache) { + BaseModel.cache = cache; } private readonly _temperature?: number; @@ -37,11 +37,11 @@ export abstract class BaseModel { supportingContext: Chunk[], conversationId = 'default', ): Promise { - const conversation = await BaseModel.conversations.getConversation(conversationId); + const conversation = await BaseModel.cache.getConversation(conversationId); this.baseDebug(`${conversation.entries.length} history entries found for conversationId '${conversationId}'`); // Add user query to history - await BaseModel.conversations.addEntryToConversation(conversationId, { + await BaseModel.cache.addEntryToConversation(conversationId, { id: uuidv4(), timestamp: new Date(), actor: 'HUMAN', @@ -61,7 +61,7 @@ export abstract class BaseModel { }; // Add AI response to history - await BaseModel.conversations.addEntryToConversation(conversationId, newEntry); + await BaseModel.cache.addEntryToConversation(conversationId, newEntry); return { ...newEntry, tokenUse: { diff --git a/core/embedjs/README.md b/core/embedjs/README.md index 0bf37efe..89d58035 100644 --- a/core/embedjs/README.md +++ b/core/embedjs/README.md @@ -1,1308 +1,30 @@ -# EmbedJs - -

-License -NPM Version +

+ EmbedJs Logo

-EmbedJs is an Open Source Framework for personalizing LLM responses. An ultimate toolkit for building powerful Retrieval-Augmented Generation (RAG) and Large Language Model (LLM) applications with ease in Node.js. - -It segments data into manageable chunks, generates relevant embeddings, and stores them in a vector database for optimized retrieval. It enables users to extract contextual information, find precise answers, or engage in interactive chat conversations, all tailored to their own data. - -Here's an example of how easy it is to get started - - -```TS -const ragApplication = await new RAGApplicationBuilder() - .addLoader({ type: 'YoutubeSearch', youtubeSearchString: 'Tesla cars' }) - .addLoader('https://en.wikipedia.org/wiki/Tesla,_Inc.') - .addLoader('https://tesla-info.com/sitemap.xml') - .setVectorDb(new LanceDb({ path: '.db' })) - .build(); -``` - -That's it. Now you can ask questions - - -```TS -console.log(await ragApplication.query('Give me the history of Tesla?')); -``` - -## Features - -- Supports all popular large language models - paid and open source - -- Supports many vector databases including self-hosted and cloud variants. - -- Load different kinds of unstructured data. Comes built in with several loaders that makes this easy. - -- Supports several cache options that can greatly improve the performance of your RAG applications in production. - -- Exposes a simple and highly configureable API allows both quick launch and deep customizabilty. - -- Use just as an embedding engine or a full blown chat API with history - -## Quick note - -The author(s) are looking to add core maintainers for this opensource project. Reach out on [Linkedin](https://www.linkedin.com/in/adhityan/) if you are interested. If you want to contribute in general - create issues on GitHub or send in PRs. - -# Contents - -- [EmbedJs](#embedjs) - - [Features](#features) - - [Quick note](#quick-note) -- [Contents](#contents) -- [Getting started](#getting-started) - - [Installation](#installation) - - [Usage](#usage) - - [Temperature](#temperature) - - [Search results count](#search-results-count) - - [Customize the prompt](#customize-the-prompt) - - [Get context (dry run)](#get-context-dry-run) - - [Delete loader](#delete-loader) - - [Get count of embedded chunks](#get-count-of-embedded-chunks) - - [Remove all embeddings / reset](#remove-all-embeddings--reset) - - [Set cut-off for relevance](#set-cut-off-for-relevance) - - [Add new loaders later](#add-new-loaders-later) - - [Loader inference](#loader-inference) -- [Loaders supported](#loaders-supported) - - [Youtube video](#youtube-video) - - [Youtube channel](#youtube-channel) - - [Youtube search](#youtube-search) - - [PDF file](#pdf-file) - - [Docx file](#docx-file) - - [Excel file](#excel-file) - - [Powerpoint file](#powerpoint-file) - - [Web page](#web-page) - - [Confluence](#confluence) - - [Sitemap](#sitemap) - - [Text](#text) - - [Json](#json) - - [Csv](#csv) - - [Add a custom loader](#add-a-custom-loader) - - [More loaders coming soon](#more-loaders-coming-soon) -- [LLMs](#llms) - - [OpenAI](#openai) - - [Azure OpenAI](#azure-openai) - - [Mistral](#mistral) - - [Hugging Face](#hugging-face) - - [Anthropic](#anthropic) - - [Vertex AI](#vertex-ai) - - [Ollama](#ollama) - - [Use custom LLM model](#use-custom-llm-model) - - [More LLMs coming soon](#more-llms-coming-soon) -- [Embedding models](#embedding-models) - - [OpenAI v3 Small](#openai-v3-small) - - [OpenAI v3 Large](#openai-v3-large) - - [Ada](#ada) - - [Cohere](#cohere) - - [Gecko Embedding](#gecko-embedding) - - [Ollama local embedding](#ollama-local-embedding) - - [Use custom embedding model](#use-custom-embedding-model) - - [More embedding models coming soon](#more-embedding-models-coming-soon) -- [Vector databases supported](#vector-databases-supported) - - [Pinecone](#pinecone) - - [LanceDB](#lancedb) - - [Chroma](#chroma) - - [HNSWLib](#hnswlib) - - [Weaviate](#weaviate) - - [Qdrant](#qdrant) - - [MongoDB (vector database)](#mongodb-vector-database) - - [Astra DB](#astra-db) - - [Bring your own database](#bring-your-own-database) - - [More databases coming soon](#more-databases-coming-soon) -- [Caches](#caches) - - [LMDB](#lmdb) - - [InMemory (cache)](#inmemory-cache) - - [Redis](#redis) - - [MongoDB (cache)](#mongodb-cache) - - [Bring your own cache](#bring-your-own-cache) - - [More caches coming soon](#more-caches-coming-soon) -- [Conversation history](#conversation-history) - - [InMemory (conversation)](#inmemory-conversation) - - [MongoDB (conversation)](#mongodb-conversation) -- [Langsmith Integration](#langsmith-integration) -- [Sample projects](#sample-projects) -- [Contributing](#contributing) - -# Getting started - -## Installation - -You can install the library via NPM or Yarn - -```bash -npm i @llm-tools/embedjs -``` - -## Usage - -To configure a new EmbedJs application, you need to do three steps - - -> **1. Pick an LLM**
-> The library supports several LLMs. Activate one by allowing the instructions in the [LLM](#llms) section. - -```TS -const ragApplication = await new RAGApplicationBuilder() - .setModel(new HuggingFace({ modelName: 'mistralai/Mixtral-8x7B-v0.1' })) - ... -``` - -**Note:** To use the library only for embeddings and not instantiate a LLM, you can pass the string `NO_MODEL` to the setModel function here. This will disable the option to call the `query` function but you can still get the embeddings with the [`getContext`](#get-context-dry-run) method. - -> **2. Pick a Vector database**
-> The library supports several vector databases. Enable one by allowing the instructions in the [Vector Databases](#vector-databases-supported) section. - -```TS - .setVectorDb(new PineconeDb({ projectName: 'test', namespace: 'dev' })) -``` - -> **3. Load some data**
-> The library supports several kinds of loaders. You can use zero, one or many kinds of loaders together to import custom knowledge. Read the [loaders](#loaders-supported) section to learn more about the different supported loaders. - -```TS - .addLoader(new YoutubeSearchLoader({ searchString: 'Tesla cars' })) - .addLoader(new SitemapLoader({ url: 'https://tesla-info.com/sitemap.xml' })) - .build(); -``` - -That's it! Now that you have your instance of `RAGApplication`, you can use it to query against the loaded data sets, like so - - -```TS -await ragApplication.query('What is Tesla?'); -``` - -## Temperature - -The temperature is a number between 0 and 1. It governs the randomness and creativity of the LLM responses. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic. You can alter it by - - -```TS -await new RAGApplicationBuilder() -.setTemperature(0.1) -``` - -**NOTE:** The default value is 0.1, which makes the GPT responses very precise. - -## Search results count - -This is the number of documents to aim for when retrieving results from the vector database. A high number of results might mean there is more non-relevant data in the context. A low number might mean none of the relevant documents are retrieved. You need to set the number that works best for you. The parameter can be altered by - - -```TS -await new RAGApplicationBuilder() -.setSearchResultCount(10) -``` - -**NOTE:** The default value is 7. - -It is important to note that the library does not simply dump all contextual document chunks into the prompt. It sends them to the model marking them as context documents. The number of documents still counts toward the token limit. - -When the number of documents fetched leads to a request above the token limit, the library uses the following strategy - - -> It runs a preprocessing step to select relevant sections from each document until the total number of tokens is less than the maximum number of tokens allowed by the model. It then uses the transformed documents as context to answer the question. - -## Customize the prompt - -LLM models need some care. The models are notorious for inventing responses when they don't know the answer. Keeping this in mind, the library auto adds a wrapper to all user queries. The default prompt is - - -> Use all the provided context to answer the query at the end. Answer in full. If you don't know the answer, just say that you don't know, don't try to make up an answer. Query: {0} - -The placeholder `{0}` is replaced with the input query. In some cases, you may want to customize this prompt. This can be done with ease by - - -```TS -await new RAGApplicationBuilder() -.setQueryTemplate('My own query template') -``` - -## Get context (dry run) - -During development, you may want to test the performance and quality of the `Loaders` you have enabled without making any LLM calls. You can do this by using the `getContext` method - - -```TS -await ragApplication.getContext('What is Steve Jobs?') -``` - -## Delete loader - -You can remove the embeddings added from a specific loader by calling the `deleteLoader` method with the uniqueId of the loader. - -```TS -await ragApplication.deleteLoader('uniqueId...', true) -``` - -## Get count of embedded chunks - -You can fetch the count of embeddedings stored in your vector database at any time by calling the `getEmbeddingsCount` method - - -```TS -await ragApplication.getEmbeddingsCount() -``` - -## Remove all embeddings / reset - -You can remove all stored embeddings in the vectorDb using the `deleteAllEmbeddings` method - - -```TS -await ragApplication.deleteAllEmbeddings(true) -``` - -## Set cut-off for relevance - -The library can filter the embeddings returned from a vector store that have a low relevance score to the query being asked. To do this, set the cut-off value using the `setEmbeddingRelevanceCutOff` method - - -```TS -await ragApplication.setEmbeddingRelevanceCutOff(0.23) -``` - -## Add new loaders later - -You can add new loaders at any point dynamically (even after calling the `build` function on `RAGApplicationBuilder`). To do this, simply call the `addLoader` method - - -```TS -await ragApplication.addLoader(new YoutubeLoader({ videoIdOrUrl: 'pQiT2U5E9tI' })); -``` - -**Note:** Do not forget to await the dynamically added loaders to ensure you wait for the load to complete before making queries on it. - -## Loader inference - -You can add most loaders by passing a string to the `addLoader` or the `addLoaders` methods. The value can be a URL, path, JSON or youtube video id. The library will infer the type of content and invoke the appropirate loader automatically. - -```TS -await ragApplication.addLoader('pQiT2U5E9tI'); //invokes youtube URL -await ragApplication.addLoader('https://lamport.azurewebsites.net/pubs/paxos-simple.pdf'); //invokes PDF loader -``` - -**Note:** If you pass the path to a local directory, every file in that directory is recursively added (including subfolders)! - -# Loaders supported - -Loaders take a specific format, process the input and create chunks of the data. You can import all the loaders from the path `@llm-tools/embedjs`. Currently, the library supports the following formats - - -## Youtube video - -To add any youtube video to your app, follow these steps - - -- Install Youtube loader package in your project - -```bash -npm install @llm-tools/embedjs-loader-youtube -``` - -- Now you can use the `YoutubeLoader` - -```TS -.addLoader(new YoutubeLoader({ videoIdOrUrl: 'w2KbwC-s7pY' })) -``` - -## Youtube channel - -To add all videos in a youtube channel, follow these steps - - -- Install Youtube loader package in your project - -```bash -npm install @llm-tools/embedjs-loader-youtube -``` - -- Now you can use the `YoutubeChannelLoader` - -```TS -.addLoader(new YoutubeChannelLoader({ youtubeChannelId: '...' })) -``` - -## Youtube search - -To do a general youtube search and add the popular search results, follow these steps - - -- Install Youtube loader package in your project - -```bash -npm install @llm-tools/embedjs-loader-youtube -``` - -- Now you can use the `YoutubeSearchLoader` - -```TS -.addLoader(new YoutubeSearchLoader({ youtubeSearchString: '...' })) -``` - -## PDF file - -To add a pdf file, use `PdfLoader`. To get started, install the PdfLoader addon - - -```bash -npm install @llm-tools/embedjs-loader-pdf -``` - -Now, you can add a local file - - -```TS -.addLoader(new PdfLoader({ filePathOrUrl: path.resolve('paxos-simple.pdf') })) -``` - -Or, you can add a remote file - - -```TS -.addLoader(new PdfLoader({ url: 'https://lamport.azurewebsites.net/pubs/paxos-simple.pdf' })) -``` - -**Note:** Currently there is no support for PDF forms and password protected documents - -## Docx file - -To add a docx file, use `DocxLoader`. To get started, install the MSOffice loader addon - - -```bash -npm install @llm-tools/embedjs-loader-msoffice -``` - -Now, you can add a local file - - -```TS -.addLoader(new DocxLoader({ filePathOrUrl: path.resolve('paxos.docx') })) -``` - -Or, you can add a remote file - - -```TS -.addLoader(new DocxLoader({ filePathOrUrl: 'https://xxx' })) -``` - -## Excel file - -To add an excel xlsx file, use `ExcelLoader`. To get started, install the MSOffice loader addon - - -```bash -npm install @llm-tools/embedjs-loader-msoffice -``` - -Now, you can add a local file - - -```TS -.addLoader(new ExcelLoader({ filePathOrUrl: path.resolve('numbers.xlsx') })) -``` - -Or, you can add a remote file - - -```TS -.addLoader(new ExcelLoader({ filePathOrUrl: 'https://xxx' })) -``` - -## Powerpoint file - -To add an powerpoint / pptx file, use `PptLoader`. To get started, install the MSOffice loader addon - - -```bash -npm install @llm-tools/embedjs-loader-msoffice -``` - -Now, you can add a local file - - -```TS -.addLoader(new PptLoader({ filePathOrUrl: path.resolve('wow.pptx') })) -``` - -Or, you can add a remote file - - -```TS -.addLoader(new PptLoader({ filePathOrUrl: 'https://xxx' })) -``` - -## Web page - -To add a web page, follow these steps - - -- Install Web loader addon in your project - -```bash -npm install @llm-tools/embedjs-loader-web -``` - -- Now you can use the `WebLoader` - -```TS -.addLoader(new WebLoader({ urlOrContent: 'https://en.wikipedia.org/wiki/Formula_One' })) -``` - -## Confluence - -To add a confluence space, follow these steps - - -- Install the Confluence loader addon in your project - -```bash -npm install @llm-tools/embedjs-loader-confluence -``` - -- set the following environment variables - - -```bash -CONFLUENCE_BASE_URL= -CONFLUENCE_USER_NAME= -CONFLUENCE_API_TOKEN= -``` - -**Note:** The confluence space name is the value you see in the url in the space overview page `/wiki/spaces/{{ space name }}/overview`. - -- Now you can use the `ConfluenceLoader` - -```TS -.addLoader(new ConfluenceLoader({ spaceNames: ['...'] })) -``` - -## Sitemap - -To add a XML sitemap, follow these steps - - -- Install the Sitemap loader addon in your project - -```bash -npm install @llm-tools/embedjs-loader-sitemap -``` - -- Now you can use the `SitemapLoader` - -```TS -.addLoader(new SitemapLoader({ url: '...' })) -``` - -This will load all URLs in a sitemap via the WebLoader. - -## Text - -To supply your own text, use `TextLoader`. - -```TS -.addLoader(new TextLoader({ text: 'The best company name for a company making colorful socks is MrSocks' })) -``` - -**Note:** Feel free to add your custom text without worrying about duplication. The library will chuck, cache and update the vector databases without duplication. - -## Json - -To add a parsed Javascript object to your embeddings, use `JsonLoader`. The library will not parse a string to JSON on its own but once this is done, it can be injested easily. - -```TS -.addLoader(new JsonLoader({ object: { key: value, ... } })) -``` - -**Note:** if you want to restrict the keys that get added to the vectorDb in a dynamically obtained object, you can use the `pickKeysForEmbedding` optional parameter in the `JsonLoader` constructor. - -## Csv - -To add a Csv file (or URL) to your embeddings, use `CsvLoader`. The library will parse the Csv and add each row to its vector database. To get started, follow these steps - - -- Install the Csv loader addon in your project - -```bash -npm install @llm-tools/embedjs-loader-csv -``` - -- Now you can use the `CsvLoader` like so - - -```TS -.addLoader(new CsvLoader({ filePathOrUrl: '...' })) -``` - -**Note:** You can control how the `CsvLoader` parses the file in great detail by passing in the optional `csvParseOptions` constructor parameter. - -## Add a custom loader - -You can pass along a custom loader to the `addLoader` method by extending and implementing the abstract class `BaseLoader`. Here's how that would look like - - -```TS -class CustomLoader extends BaseLoader<{ customChunkMetadata: string }> { - constructor() { - super('uniqueId'); - } - - async *getChunks() { - throw new Error('Method not implemented.'); - } -} -``` - -We really encourage you send in a PR to this library if you are implementing a common loader pattern, so the community can benefit from it. - -## More loaders coming soon - -If you want to add any other format, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will add it to the list of supported formats. All PRs are welcome. - -# LLMs - -It's relatively easy to switch between different LLMs using the library. You can import any of the LLMs from the path `@llm-tools/embedjs`. We support the following LLMs today - - -## OpenAI - -To use the OpenAI LLM models, you need a API key from OpenAI. You can alternatively use Azure OpenAI to run these models. Read the [Azure OpenAI](#azure-openai) section below to learn more about this. In this section, we will cover how to use OpenAI provided LLMs. - -The first step is to obtain an API Key from OpenAI. You can do this by visiting their [API Portal](https://platform.openai.com/api-keys). Once you obtain a key, set it as an environment variable, like so - - -```bash -OPENAI_API_KEY="" -``` - -Next, you need to install the OpenAI addon - - -```bash -npm install @llm-tools/embedjs-openai -``` - -Once these two steps are done, it is relatively easy to run OpenAI LLMs. All you need is to indicate the model type you want to run. - -- For GPT 3.5 Turbo - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(SIMPLE_MODELS.OPENAI_GPT3_TURBO) -``` - -- For GPT 4 - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(SIMPLE_MODELS.OPENAI_GPT4) -``` - -- To use a custom model name - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new OpenAi({ modelName: 'gpt-4' })) -``` - -**Note:** GPT 3.5 Turbo is used as the default model if you do not specifiy one. - -## Azure OpenAI - -In order to be able to use an OpenAI model on Azure, it first needs to be deployed. Please refer to [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/) on how to deploy a model on Azure. To run this library, you will need to deploy two models - - -- text-embedding-ada (or any of the newer models) -- GPT-3.5-turbo (or the 4 series) - -Once these models are deployed, using Azure OpenAI instead of the regular OpenAI is easy to do. Just follow these steps - - -- Remove the `OPENAI_API_KEY` environment variable if you have set it already. - -- Set the following environment variables - - -```bash -# Set this to `azure` -OPENAI_API_TYPE=azure -# The API version you want to use -AZURE_OPENAI_API_VERSION=2023-05-15 -# The base URL for your Azure OpenAI resource. You can find this in the Azure portal under your Azure OpenAI resource. -export AZURE_OPENAI_BASE_PATH=https://your-resource-name.openai.azure.com/openai/deployments -# The API key1 or key2 for your Azure OpenAI resource -export AZURE_OPENAI_API_KEY= -# The deployment name you used for your embedding model -AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME=text-embedding-ada-002 -# The deployment name you used for your llm -AZURE_OPENAI_API_DEPLOYMENT_NAME=gpt-35-turbo -``` - -You are now all set and can now run the Azure OpenAI LLMs using the [`OpenAi` model](#openai) steps detailed above. - -## Mistral - -To use Mirstal's models, you will need to get an API Key from Mistral. You can do this from their [console](https://console.mistral.ai/user/api-keys/). Next, you need to install the Mistral addon to embedJs - - -```bash -npm install @llm-tools/embedjs-mistral -``` - -Once these steps are complete, set Mistral as your LLM of choice - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Mistral({ accessToken: "" })) -``` - -By default, the `mistral-medium` model from Mistral is used. If you want to use a different Mistral model, you can specify it via the optional parameter to the Mistral constructor, like so - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Mistral({ accessToken: "", modelName: "..." })) -``` - -**Note:** If you want to run Mistral open source for free, you can do so using the HuggingFace platform (read below). Just make sure to set the modelName to `mistralai/Mistral-7B-v0.1` or the version you want to run. - -## Hugging Face - -Hugging face needs no introduction. They host a variety of open source LLMs and you can use most of them for free. To run hugging face inference based LLMs with this library, you will need a free hugging face token. - -You can get an API Token by signing up for hugging face and generate a token from [this page](https://huggingface.co/settings/tokens). Once you get the token, set it to the environment like so - - -```bash -HUGGINGFACEHUB_API_KEY="" -``` - -Next you need to install the hugging face addon for embedJs - - -```bash -npm install @llm-tools/embedjs-huggingface -``` - -That's all, now you can use any of the hugging face models. To do this set `HuggingFace` as your model processor of choice - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new HuggingFace({ modelName: "..." }))) -``` - -**Note:** Not all hugging face models are fully free to consume via their API. Since running these models takes a lot of resources, Hugging Face charges a fee for a few of the larger ones. This is the case with Meta's `meta-llama/Llama-2-7b-hf`, for example. - -To use these 'not-free' models via HuggingFace, you need to subscribe to their [Pro plan](https://huggingface.co/pricing) or create a custom [inference endpoint](https://ui.endpoints.huggingface.co/). It is possible to self host these models for free and run them locally via Ollama - support for which is coming soon. - -## Anthropic - -To use Anthropic's Claude models, you will need to get an API Key from Anthropic. You can do this from their [console](https://console.anthropic.com/settings/keys). Once you obtain a key, set it in the environment variable, like so - - -```bash -ANTHROPIC_API_KEY="" -``` - -Next, you need to install the Anthropic extension for embedJs like so - - -```bash -npm install @llm-tools/embedjs-anthropic -``` - -Once these are done, it is relatively easy to use Anthropic's Claude in your RAG application. Simply set Anthropic as your LLM of choice - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Anthropic()) -``` - -By default, the `claude-3-sonnet-20240229` model from Anthropic is used. If you want to use a different Anthropic model, you can specify it via the optional parameter to the Anthropic constructor, like so - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Anthropic({ modelName: "..." })) -``` - -You can read more about the various models provided by Anthropic [here](https://docs.anthropic.com/claude/docs/models-overview). - -## Vertex AI - -You to use Gemini LLM and other models on Google Cloud Platform via [VertexAI](https://cloud.google.com/vertex-ai?hl=en). Read more about all the supported [LLMs](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models). - -To get started, you need to set the right access credentials to google cloud. You have two options here - - -- Authenticate by using `gcloud` CLI: - -``` -gcloud auth application-default login -``` - -- Authentication using Service Account with JSON key and environment variable: - -```bash -GOOGLE_APPLICATION_CREDENTIALS="" -``` - -- Install the vertex ai addon for embedJs - -```bash -npm install @llm-tools/embedjs-vertexai -``` - -Now all you need to do is set the model to `VertexAI`. Here's an example - - -```TS -const ragApplication = await new RAGApplicationBuilder() - .setModel(new VertexAI({ modelName: 'gemini-1.5-pro-preview-0409'})) - .setEmbeddingModel(new GeckoEmbedding()) -``` - -See also `/examples/vertexai` for [further documentation](/examples/vertexai/README.md) about authentication options and how to use it. - -**Note:** Default model is `gemini-1.0-pro`. - -## Ollama - -You can also use locally running Ollama models. Installation instructions for Ollama can be found [here](https://ollama.com/). - -Once Ollama is installed, you can start a local LLM by executing `ollama run `. Next to be able to use Ollama in embedJs, install the Ollama addon - - -```bash -npm install @llm-tools/embedjs-ollama -``` - -Once this is done, you can use that in the `Ollama` constructor by passing the `modelName` parameter. Here's an example - - -```TS -const ragApplication = await new RAGApplicationBuilder() -.setModel(new Ollama({ - modelName: "llama3", - baseUrl: 'http://localhost:11434' -})) -``` - -**Note:** Default port in which Ollama runs, is `11434`, but if for some reason you use something else, you can pass `baseUrl` with the port number as the second argument: - -## Use custom LLM model - -You can use a custom LLM model by implementing the `BaseModel` interface. Here's how that would look like - - -```TS -class MyOwnLLMImplementation implements BaseModel { - override async init(): Promise {} //optional to override - - protected abstract runQuery( - system: string, //the system prompt - userQuery: string, //the current user query - supportingContext: Chunk[], //all supporting documents - pastConversations: ConversationHistory[], //the chat history so far - ): Promise { - throw new Error("Method not implemented."); - } -} -``` - -Once done, you can pass this class to the `setModel` method like shown in the examples above. That said, we really encourage you send in a PR to this library if you are implementing a famous or common LLM, so the community can benefit from it. - -## More LLMs coming soon - -If you want us to add support for a specific LLM, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will prioritize it. All PRs are welcome. - -Currently, we next plan to add support for Ollama. - -# Embedding models - -Embedding models are LLMs that convert a string into vector better suited for processing. In most cases, the default `text-embedding-3-small` model from OpenAI is going to be good enough. If you want to use this model, you do not have to do anything extra. - -However in some advanced cases, you may want to change this; after all, different embedding models perform differently under different curcumstances. The library allows you to do this using the method `setEmbeddingModel` while building the `RAGApplication`. - -The library supports the following embedding models - - -## OpenAI v3 Small - -The `text-embedding-3-small` is a new standard embedding model released by OpenAI in Jan, 2024. It is the default used by the libary. This model is cheaper and better than their older Ada model. This model returns vectors with dimension 1536. - -You do not have to do anything to enable it. - -## OpenAI v3 Large - -The `text-embedding-3-large` is also a new standard embedding model released by OpenAI in Jan, 2024. This model is the best embedding model provided by OpenAI as of now but is also the most expensive. This model returns vectors with dimension 3072. - -To set it as your model of choice - - -- Set `OpenAi3LargeEmbeddings` as your embedding model on `RAGApplicationBuilder` - -```TS -import { OpenAi3LargeEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new OpenAi3LargeEmbeddings()) -``` - -## Ada - -The `text-embedding-ada-002` is a well known model from OpenAI. You can read more about it [here](https://openai.com/blog/new-and-improved-embedding-model). This model returns vectors with dimension 1536. - -To set it as your model of choice - - -- Set `AdaEmbeddings` as your embedding model on `RAGApplicationBuilder` - -```TS -import { AdaEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new AdaEmbeddings()) -``` - -## Cohere - -The library supports usage of [Cohere-AI](https://cohere.com) `embed-english-v2.0` embedding model out of the box. This model returns vectors with dimension 4096. - -Here's what you have to do to enable it - - -- Sign up for an account with Cohere-AI if you have not done so already. Once done, go to the [API Keys](https://dashboard.cohere.ai/api-keys) section and copy an API_KEY. - -- Load the key you just obtained in the environment variable `COHERE_API_KEY` - -```bash -COHERE_API_KEY="" -``` - -- Set `CohereEmbeddings` as your embedding model on `RAGApplicationBuilder` - -```TS -import { CohereEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new CohereEmbeddings()) -``` - -## Gecko Embedding - -The libaray supports the embedding model `textembedding-gecko` with 768 dimensions on [VertexAI](https://cloud.google.com/vertex-ai/generative-ai/docs/embeddings/get-text-embeddings). - -To use this, you can authenticate to Vertex AI on GCP. Refer [here](#vertex-ai) on how to do this. Once done, simply set `GeckoEmbedding` as your choice of embedding model, like so - - -```TS -import { GeckoEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new GeckoEmbeddings()) -``` - -For an example usage of GeckoEmbeddings with Gemini LLM on VertexAI check the folder `/examples/vertexai/`. - -## Ollama local embedding - -The libaray supports fully local embeddings via `Ollama`. Read more here [Ollama embeddings](https://ollama.com/blog/embedding-models). - -To use this, you need to setup and have Ollama working locally. Refer to their Github [here](https://github.com/ollama/ollama) to understand how to do this. Once done, simply set `OllamaEmbeddings` as your choice of embedding model, like so - - -```TS -import { OllamaEmbeddings } from '@llm-tools/embedjs'; - -await new RAGApplicationBuilder() -.setEmbeddingModel(new OllamaEmbeddings({ - model: '...', - baseUrl: '...' -})) -``` - -## Use custom embedding model - -You can use your own custom embedding model by implementing the `BaseEmbeddings` interface. Here's how that would look like - - -```TS -class MyOwnEmbeddingImplementation implements BaseEmbeddings { - embedDocuments(texts: string[]): Promise { - throw new Error("Method not implemented."); - } - - embedQuery(text: string): Promise { - throw new Error("Method not implemented."); - } - - getDimensions(): number { - throw new Error("Method not implemented."); - } -} -``` - -Once done, you can pass this class to the `setEmbeddingModel` method like shown in the Cohere example above. That said, we really encourage you send in a PR to this library if you are implementing a famous or common embedding provider, so the community can benefit from it. - -## More embedding models coming soon - -If you want us to add support for a specific embedding model, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will prioritize it. All PRs are welcome. - -# Vector databases supported - -The library allows you to save your processed and unique embeddings with the vector databases of your choice. Here are the supported databases right now - - -## Pinecone - -You can enable Pinecone storage by following these steps - - -- Create an account with [Pinecone](https://www.pinecone.io/) if you don't have one already. There is a _good free tier_. - -- Install pinecone package in your project - -```bash -npm install @pinecone-database/pinecone -``` - -- Set the pinecone environment variable `PINECONE_API_KEY`. This can be obtained from the **API Keys** section on the Pinecone dashboard. - -```bash -PINECONE_API_KEY= -``` - -- Set the Pinecone database as your choice of `vectorDb` - -```TS -import { PineconeDb } from '@llm-tools/embedjs/vectorDb/pinecone'; - -.setVectorDb(new PineconeDb({ - projectName: 'test', - namespace: 'dev', - indexSpec: { - pod: { - podType: 'p1.x1', - environment: 'us-east1-gcp', - }, - }, -})) -``` - -**Note:** Pinecone supports serverless and pod based index deployments. You can control how you want your index created using the indexSpec attribute. This is mandatory to be provided but comes with full type specification. Read more about configuring this [here](https://github.com/pinecone-io/pinecone-ts-client/blob/main/v2-migration.md). - -## LanceDB - -[LanceDB](https://lancedb.com/) is a local vector database with great performance. Follow these steps to use LanceDB as your vector database - - -- Install LanceDb package in your project - -```bash -npm install @lancedb/lancedb -``` - -- Set LanceDB database as your choice of `vectorDb` - -```TS -import { LanceDb } from '@llm-tools/embedjs/vectorDb/lance'; - -.setVectorDb(new LanceDb({ path: path.resolve('/db') })) -``` - -**Note:** The `path` property will be used by LanceDB to create a directory to host all the database files. There is also support for creating temporary directories for testing - - -```TS -import { LanceDb } from '@llm-tools/embedjs/vectorDb/lance'; - -.setVectorDb(new LanceDb({ path: 'lance-', isTemp: true })) -``` - -In this case, the `path` property is used as a prefix to create the temporary directory in the OS temp directory folder. - -## Chroma - -**Note:** The chroma addon is currently not published / supported. There are some type issues in the upstream dependencies that are being resolved. - -[Chroma](https://trychroma.com/) is an open source vector database. It's designed to be Python first and to connect to it from NodeJS, you will need to run Chroma in a container following the steps [listed here](https://docs.trychroma.com/deployment). Once done, follow these steps to use Chroma as your vector database - - -- Install Chroma package in your project - -```bash -npm install chromadb -``` - -- Set Chroma database as your choice of `vectorDb` - -```TS -import { ChromaDb } from '@llm-tools/embedjs/vectorDb/chroma'; - -.setVectorDb(new ChromaDb({ url: 'http://localhost:8000' })) -``` - -**Note:** This is the default url and port if you run the Chroma docker container using the command `docker-compose up -d --build`. - -A warning - - -> In our testing, chroma performed the poorest in being able to retrieve relevant documents among the supported vector databases. - -## HNSWLib - -[HNSWLib](https://github.com/nmslib/hnswlib) is an in-memory vectorstore. It is great for beginners to get started with since you do not need access to the file system or a cloud service. Follow these steps to use HNSWLib as your vector database - - -- Install HNSWLib package in your project - -```bash -npm install hnswlib-node -``` - -- Set HNSWLib database as your choice of `vectorDb` - -```TS -import { HNSWDb } from '@llm-tools/embedjs/vectorDb/hnswlib'; - -.setVectorDb(new HNSWDb()) -``` - -**Note:** This is a purely in-memory vector store. All values are lost when application is restarted. - -## Weaviate - -[Weaviate](https://weaviate.io/) is an open source vector store. You can deploy it locally on docker or use their managed cloud offering. Follow these steps to use Weaviate as your vector database - - -- Install Weaviate package in your project - -```bash -npm install weaviate-ts-client -``` - -- Set Weaviate database as your choice of `vectorDb` - -```TS -import { WeaviateDb } from '@llm-tools/embedjs/vectorDb/weaviate'; - -.setVectorDb(new WeaviateDb({ host: '...', apiKey: '...', className: '...', scheme: '...' })) -``` - -## Qdrant - -[Qdrant](https://qdrant.tech/) is an Open-Source Vector Database and Vector Search Engine written in Rust. To use it - - -- Install Qdrant package in your project - -```bash -npm install @qdrant/js-client-rest -``` - -- Set Qdrant database as your choice of `vectorDb` - -```TS -import { QdrantDb } from '@llm-tools/embedjs/vectorDb/qdrant'; - -.setVectorDb(new QdrantDb({ apiKey: '...'; url: '...'; clusterName: '...' })) -``` - -## MongoDB (vector database) - -[MongoDB](https://www.mongodb.com/products/platform/atlas-vector-search) is an open source document database. They offer a managed cloud offering **MongoDB Atlas**. As of right now, only the Atlas version supports vector search while the open source version does not. - -To use MongoDB as your vector database, follow these steps - - -- Sign up for a MongoDB Atlas account if you haven't already. Once you have signed up, you will need to spin up a new cluster (or use an existing one) - -**Note:** you will need to provision a M10 (or higher) instance type to use Atlas vector search. Cheaper instance types or the free version (M0) give an error when vector indexes are created programatically. - -- The cluster creation takes a few minutes. Once the cluster is ready, click on the connect button on the dashboard to get the connection string. - -**Note:** You will need to add a users separately and allow IP access from your relevant development and production environments. - -- Install mongodb package in your project - -```bash -npm install mongodb -``` - -- Set MongoDB database as your choice of `vectorDb` - -```TS -import { MongoDb } from '@llm-tools/embedjs/vectorDb/mongodb'; - -.setVectorDb( - new MongoDb({ - connectionString: 'mongodb+srv://:@', - }), -) -``` - -**Note:** you can also optionally configure the database and collection name the library will use with the constructor parameters `dbName` and `collectionName`. Default values are used if these are not provided. - -## Astra DB - -[Astra DB is a document database with a highly performant vector index](https://www.datastax.com/products/datastax-astra) powered by Apache Cassandra and available as a managed service. - -To use Astra DB as your vector database follow these steps: - -- [Sign up for an Astra DB account](https://astra.datastax.com/signup). It is free to sign up and doesn't require a credit card. -- Create a database (this takes a couple of minutes to provision) -- From the database overview page get the API Endpoint and generate an Application Token -- Install the Astra DB package in your project: - ```bash - npm install @datastax/astra-db-ts - ``` -- Set Astra DB as your choice of `vectorDb` - - ```TS - import { AstraDb } from '@llm-tools/embedjs/vectorDb/astra-db' - - .setVectorDb( - new AstraDb({ - endpoint: process.env.ASTRA_DB_API_ENDPOINT, - apiKey: process.env.ASTRA_DB_APP_TOKEN, - collectionName: "documents" - }), - ) - ``` - -## Bring your own database - -You can pass along your vector database to the `setVectorDb` method by implementing the interface `BaseDb`. Here's how that would look like - - -```TS -class MyOwnDb implements BaseDb { - async init({ dimensions }: { dimensions: number }): Promise { - throw new Error('Method not implemented.'); - } - - async insertChunks(chunks: EmbeddedChunk[]): Promise { - throw new Error('Method not implemented.'); - } - - async similaritySearch(query: number[], k: number): Promise { - throw new Error('Method not implemented.'); - } - - async getVectorCount(): Promise { - throw new Error('Method not implemented.'); - } - - async deleteKeys(keys: string[]): Promise { - throw new Error('Method not implemented.'); - } - - async reset(): Promise { - throw new Error('Method not implemented.'); - } -} -``` - -We really encourage you send in a PR to this library if you are implementing a famous or common database, so the community can benefit from it. - -## More databases coming soon - -If you want to add support for any other vector database, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will add it to the list of supported databases. All PRs are welcome. - -# Caches - -Caches serve to reduce re-processing embeddings, loaders and queries. There is no need to load, chunk and store a large PDF File or web page on every run. Caching smartly is built in and can be enabled out of the box simply by setting a cache processor using the method `setCache` while building the `RAGApplication`. - -The library supports the following caches - - -## LMDB - -You can use [LMDB](https://dbdb.io/db/lmdb) to cache values locally on disk. - -- Install LMDB package in your project - -```bash -npm install lmdb -``` - -- Set `LmdbCache` as your cache provider on `RAGApplicationBuilder` - -```TS -import { LmdbCache } from '@llm-tools/embedjs/cache/lmdb'; - -await new RAGApplicationBuilder() -.setCache(new LmdbCache({ path: path.resolve('./cache') })) -``` - -**Note:** The `path` property will be used by the LMDB driver to create a folder housing the LMDB database files. - -## InMemory (cache) - -You can use a simple in-memory cache to store values during testing. - -- Set `MemoryCache` as your cache provider on `RAGApplicationBuilder` - -```TS -import { MemoryCache } from '@llm-tools/embedjs/cache/memory'; - -await new RAGApplicationBuilder() -.setCache(new MemoryCache()) -``` - -**Note:** Although this cache can remove duplicate loaders and chunks, its store does not persist between process restarts. You should only be using it for testing. - -## Redis - -You can use redis as a cache to store values. - -- Set `RedisCache` as your cache provider on `RAGApplicationBuilder` - -```TS -import { RedisCache } from '@llm-tools/embedjs/cache/redis'; - -await new RAGApplicationBuilder() -.setCache(new RedisCache({ ... })) -``` - -**Note:** The library internally uses `IORedis` to work with redis. `RedisCache` constructor supports all `IORedis` constructor parameters. Check [`IORedis` documentation](https://github.com/redis/ioredis) for more detials. - -## MongoDB (cache) - -You can use a MongoDB as a cache to cache values. - -- Set `MongoCache` as your cache provider on `RAGApplicationBuilder` - -```TS -import { MemoryCache } from '@llm-tools/embedjs/cache/mongo'; - -await new RAGApplicationBuilder() -.setCache(new MongoCache({ ... })) -``` - -## Bring your own cache - -You can pass along your own cache provider to the `setCache` method by implementing the interface `BaseCache`. Here's how that would look like - - -```TS -class MyOwnCache implements BaseCache { - async init(): Promise { - throw new Error("Method not implemented."); - } - - async addLoader(loaderId: string, chunkCount: number ): Promise { - throw new Error("Method not implemented."); - } - - async getLoader(loaderId: string): Promise<{ chunkCount: number }> { - throw new Error("Method not implemented."); - } - - async hasLoader(loaderId: string): Promise { - throw new Error("Method not implemented."); - } -} -``` - -We really encourage you send in a PR to this library if you are implementing a famous or common cache provider, so the community can benefit from it. - -## More caches coming soon - -If you want to add support for any other cache providers, please create an [issue](https://github.com/llm-tools/embedjs/issues) and we will add it to the list of supported caches. All PRs are welcome. - -# Conversation history - -EmbedJS allows the addition of various storage layers for conversations. This allows the conversation history to be stored and made persistant between sessions. Like all other aspects of embedJS there is a base interface for conversations and you can create your own conversation history implementation. - -The library supports the following conversation history types out of the box - - -## InMemory (conversation) - -You can use a simple in-memory object to store conversation history during testing. This is the default activated conversation history manager if you don't specify anything else. This cache is used by **default** if no other cache is specified. - -- Set `InMemoryConversation` as your cache provider on `RAGApplicationBuilder` - -```TS -import { MemoryConversations } from '@llm-tools/embedjs/conversation/memory'; - -await new RAGApplicationBuilder() -.setConversationEngine(new InMemoryConversation()) -``` - -**Note:** Although this cache does remove duplicate loaders and chunks, its store does not persist between process restarts. - -## MongoDB (conversation) - -Can be used with any version of MongoDb. - -- Set `MongoConversation` as your cache provider on `RAGApplicationBuilder` - -```TS -import { MongoConversation } from '@llm-tools/embedjs/conversation/mongo'; - -await new RAGApplicationBuilder() -.setConversationEngine(new MongoConversations({ - uri: MONGODB_URI, - dbName: DB_NAME, - collectionName: CONVERSATIONS_COLLECTION_NAME -});) -``` +

+ License + NPM Version +

-# Langsmith Integration +
-Langsmith allows you to keep track of how you use LLM and embedding models. It logs histories, token uses and other metadata. Follow these three simple steps to enable - +## What is EmbedJs? -- Sign up for an account with [Langsmith](https://smith.langchain.com/) -- Generate an API Key from your admin page -- Set the following environment keys in your project +EmbedJs is an Open Source Framework for personalizing LLM responses. An ultimate toolkit for building powerful Retrieval-Augmented Generation (RAG) and Large Language Model (LLM) applications with ease in Node.js. -```bash -export LANGCHAIN_TRACING_V2=true -export LANGCHAIN_ENDPOINT="https://api.smith.langchain.com" -export LANGCHAIN_PROJECT="" -export LANGCHAIN_API_KEY="" -``` +It segments data into manageable chunks, generates relevant embeddings, and stores them in a vector database for optimized retrieval. It enables users to extract contextual information, find precise answers, or engage in interactive chat conversations, all tailored to their own data. -# Sample projects +## 📖 Documentation -Here's a list of projects / examples built with RagKit +Comprehensive guides and API documentation are available to help you get the most out of EmbedJs: -| **Project** | **Description** | -| ------------------------------------------------------------ | ---------------------------------------------------------------------- | -| [slack-bot](https://github.com/llm-tools/slack-bot-template) | A NestJs based slack bot that can answer questions based on confluence | +- [Introduction](https://llm-tools.mintlify.app/get-started/introduction#what-is-embedjs) +- [Getting Started](https://llm-tools.mintlify.app/get-started/quickstart) +- [Supported data types](https://llm-tools.mintlify.app/components/data-sources/overview) +- [Examples](https://llm-tools.mintlify.app/examples) -# Contributing +## 🌐 Contributing Contributions are welcome! Please check out the issues on the repository, and feel free to open a pull request. For more information, please see the [contributing guidelines](CONTRIBUTING.md). diff --git a/core/embedjs/src/cache/memory-cache.ts b/core/embedjs/src/cache/memory-cache.ts index 49cc52a7..9bd31af8 100644 --- a/core/embedjs/src/cache/memory-cache.ts +++ b/core/embedjs/src/cache/memory-cache.ts @@ -1,12 +1,14 @@ -import { BaseCache } from '@llm-tools/embedjs-interfaces'; +import { BaseCache, Conversation, Message } from '@llm-tools/embedjs-interfaces'; export class MemoryCache implements BaseCache { private loaderList: Record; private loaderCustomValues: Record>; + private conversations: Map; async init(): Promise { this.loaderList = {}; this.loaderCustomValues = {}; + this.conversations = new Map(); } async addLoader(loaderId: string, chunkCount: number): Promise { @@ -40,4 +42,36 @@ export class MemoryCache implements BaseCache { async loaderCustomDelete(loaderCombinedId: string): Promise { delete this.loaderList[loaderCombinedId]; } + + async addConversation(conversationId: string): Promise { + if (!this.conversations.has(conversationId)) { + this.conversations.set(conversationId, { conversationId, entries: [] }); + } + } + + async getConversation(conversationId: string): Promise { + if (!this.conversations.has(conversationId)) { + // Automatically create a new conversation if it does not exist + this.conversations.set(conversationId, { conversationId, entries: [] }); + } + + return this.conversations.get(conversationId)!; + } + + async hasConversation(conversationId: string): Promise { + return this.conversations.has(conversationId); + } + + async deleteConversation(conversationId: string): Promise { + this.conversations.delete(conversationId); + } + + async addEntryToConversation(conversationId: string, entry: Message): Promise { + const conversation = await this.getConversation(conversationId); + conversation.entries.push(entry); + } + + async clearConversations(): Promise { + this.conversations.clear(); + } } diff --git a/core/embedjs/src/conversation/memory-conversations.ts b/core/embedjs/src/conversation/memory-conversations.ts deleted file mode 100644 index 8e54093e..00000000 --- a/core/embedjs/src/conversation/memory-conversations.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { BaseConversation, Conversation, Message } from '@llm-tools/embedjs-interfaces'; - -export class InMemoryConversation implements BaseConversation { - private conversations: Map = new Map(); - - async init(): Promise { - this.conversations.clear(); - } - - async addConversation(conversationId: string): Promise { - if (!this.conversations.has(conversationId)) { - this.conversations.set(conversationId, { conversationId, entries: [] }); - } - } - - async getConversation(conversationId: string): Promise { - if (!this.conversations.has(conversationId)) { - // Automatically create a new conversation if it does not exist - this.conversations.set(conversationId, { conversationId, entries: [] }); - } - - return this.conversations.get(conversationId)!; - } - - async hasConversation(conversationId: string): Promise { - return this.conversations.has(conversationId); - } - - async deleteConversation(conversationId: string): Promise { - this.conversations.delete(conversationId); - } - - async addEntryToConversation(conversationId: string, entry: Message): Promise { - const conversation = await this.getConversation(conversationId); - conversation.entries.push(entry); - } - - async clearConversations(): Promise { - this.conversations.clear(); - } -} diff --git a/core/embedjs/src/core/rag-application-builder.ts b/core/embedjs/src/core/rag-application-builder.ts index 35fad7b3..891f967f 100644 --- a/core/embedjs/src/core/rag-application-builder.ts +++ b/core/embedjs/src/core/rag-application-builder.ts @@ -1,21 +1,13 @@ +import { BaseCache, BaseDb, BaseEmbeddings, BaseLoader, BaseModel, SIMPLE_MODELS } from '@llm-tools/embedjs-interfaces'; +import { MemoryCache } from '../cache/memory-cache.js'; import { RAGApplication } from './rag-application.js'; -import { - BaseCache, - BaseConversation, - BaseDb, - BaseEmbeddings, - BaseLoader, - BaseModel, - SIMPLE_MODELS, -} from '@llm-tools/embedjs-interfaces'; export class RAGApplicationBuilder { private temperature: number; private model: BaseModel | SIMPLE_MODELS | null; private loaders: BaseLoader[]; private vectorDb: BaseDb; - private cache?: BaseCache; - private conversations: BaseConversation; + private cache: BaseCache; private queryTemplate: string; private searchResultCount: number; private embeddingModel: BaseEmbeddings; @@ -32,6 +24,7 @@ export class RAGApplicationBuilder { Do not use words like context or training data when responding. You can say you do not have all the information but do not indicate that you are not a reliable source.`; this.embeddingRelevanceCutOff = 0; + this.cache = new MemoryCache(); } /** @@ -44,22 +37,6 @@ export class RAGApplicationBuilder { return entity; } - addLoader(loader: BaseLoader) { - this.loaders.push(loader); - return this; - } - - /** - * The setSearchResultCount function sets the search result count - * @param {number} searchResultCount - The `searchResultCount` parameter - * represents the count of search results picked up from the vector store per query. - * @returns The `this` object is being returned, which allows for method chaining. - */ - setSearchResultCount(searchResultCount: number) { - this.searchResultCount = searchResultCount; - return this; - } - /** * The function setVectorDb sets a BaseDb object * @param {BaseDb} vectorDb - The `vectorDb` parameter is an instance of the `BaseDb` class, which @@ -71,14 +48,29 @@ export class RAGApplicationBuilder { return this; } - setTemperature(temperature: number) { - this.temperature = temperature; - if (this.model) this.setModel(this.model); + setEmbeddingModel(embeddingModel: BaseEmbeddings) { + this.embeddingModel = embeddingModel; return this; } - setEmbeddingRelevanceCutOff(embeddingRelevanceCutOff: number) { - this.embeddingRelevanceCutOff = embeddingRelevanceCutOff; + setModel(model: 'NO_MODEL' | SIMPLE_MODELS | BaseModel) { + if (typeof model === 'object') this.model = model; + else { + if (model === 'NO_MODEL') this.model = null; + else this.model = model; + } + + return this; + } + + setCache(cache: BaseCache) { + this.cache = cache; + return this; + } + + setTemperature(temperature: number) { + this.temperature = temperature; + if (this.model) this.setModel(this.model); return this; } @@ -90,23 +82,24 @@ export class RAGApplicationBuilder { return this; } - setCache(cache: BaseCache) { - this.cache = cache; + setEmbeddingRelevanceCutOff(embeddingRelevanceCutOff: number) { + this.embeddingRelevanceCutOff = embeddingRelevanceCutOff; return this; } - setEmbeddingModel(embeddingModel: BaseEmbeddings) { - this.embeddingModel = embeddingModel; + addLoader(loader: BaseLoader) { + this.loaders.push(loader); return this; } - setModel(model: 'NO_MODEL' | SIMPLE_MODELS | BaseModel) { - if (typeof model === 'object') this.model = model; - else { - if (model === 'NO_MODEL') this.model = null; - else this.model = model; - } - + /** + * The setSearchResultCount function sets the search result count + * @param {number} searchResultCount - The `searchResultCount` parameter + * represents the count of search results picked up from the vector store per query. + * @returns The `this` object is being returned, which allows for method chaining. + */ + setSearchResultCount(searchResultCount: number) { + this.searchResultCount = searchResultCount; return this; } @@ -145,13 +138,4 @@ export class RAGApplicationBuilder { getModel() { return this.model; } - - setConversationEngine(conversations: BaseConversation) { - this.conversations = conversations; - return this; - } - - getConversationsEngine() { - return this.conversations; - } } diff --git a/core/embedjs/src/core/rag-application.ts b/core/embedjs/src/core/rag-application.ts index ef6f2882..76baf45c 100644 --- a/core/embedjs/src/core/rag-application.ts +++ b/core/embedjs/src/core/rag-application.ts @@ -2,7 +2,6 @@ import createDebugMessages from 'debug'; import { RAGEmbedding } from './rag-embedding.js'; import { RAGApplicationBuilder } from './rag-application-builder.js'; -import { InMemoryConversation } from '../conversation/memory-conversations.js'; import { AddLoaderReturn, BaseCache, @@ -23,7 +22,7 @@ export class RAGApplication { private readonly embeddingRelevanceCutOff: number; private readonly searchResultCount: number; private readonly queryTemplate: string; - private readonly cache?: BaseCache; + private readonly cache: BaseCache; private readonly vectorDb: BaseDb; private loaders: BaseLoader[]; private model: BaseModel; @@ -31,6 +30,7 @@ export class RAGApplication { constructor(llmBuilder: RAGApplicationBuilder) { this.cache = llmBuilder.getCache(); BaseLoader.setCache(this.cache); + BaseModel.setCache(this.cache); this.queryTemplate = cleanString(llmBuilder.getQueryTemplate()); this.debug(`Using system query template - "${this.queryTemplate}"`); @@ -55,10 +55,7 @@ export class RAGApplication { public async init(llmBuilder: RAGApplicationBuilder) { this.model = await this.getModel(llmBuilder.getModel()); if (!this.model) this.debug('No base model set; query function unavailable!'); - else { - BaseModel.setDefaultTemperature(llmBuilder.getTemperature()); - BaseModel.setConversations(llmBuilder.getConversationsEngine() || new InMemoryConversation()); - } + else BaseModel.setDefaultTemperature(llmBuilder.getTemperature()); this.loaders = llmBuilder.getLoaders(); @@ -158,7 +155,7 @@ export class RAGApplication { */ private async _addLoader(loader: BaseLoader): Promise { const uniqueId = loader.getUniqueId(); - this.debug('Add loader called for', uniqueId); + this.debug('Adding loader', uniqueId); await loader.init(); const chunks = await loader.getChunks(); @@ -167,7 +164,7 @@ export class RAGApplication { this.debug(`Loader previously run. Deleting previous ${previousChunkCount} keys`, uniqueId); if (previousChunkCount > 0) { - await this.deleteLoader(uniqueId, true); + await this.deleteLoader(uniqueId); } } @@ -212,28 +209,6 @@ export class RAGApplication { return BaseLoader.getLoadersList(); } - /** - * The function `deleteLoader` deletes embeddings from a loader after confirming the action. - * @param {string} uniqueLoaderId - The `uniqueLoaderId` parameter is a string that represents the - * identifier of the loader that you want to delete. - * @param {boolean} [areYouSure=false] - The `areYouSure` parameter is a boolean flag that - * indicates whether the user has confirmed their intention to delete embeddings from a loader. If - * `areYouSure` is `true`, the function proceeds with the deletion process. If `areYouSure` is - * `false`, a warning message is logged and no action is taken - * @returns The `deleteLoader` method returns a boolean value indicating the success of the operation. - */ - public async deleteLoader(uniqueLoaderId: string, areYouSure = false) { - if (!areYouSure) { - console.warn('Delete embeddings from loader called without confirmation. No action taken.'); - return false; - } - - const deleteResult = await this.vectorDb.deleteKeys(uniqueLoaderId); - if (this.cache && deleteResult) await this.cache.deleteLoader(uniqueLoaderId); - this.loaders = this.loaders.filter((x) => x.getUniqueId() != uniqueLoaderId); - return deleteResult; - } - /** * The function `batchLoadChunks` processes chunks of data in batches and formats them for insertion. * @param {string} uniqueId - The `uniqueId` parameter is a string that represents a unique @@ -318,20 +293,24 @@ export class RAGApplication { } /** - * The function `deleteAllEmbeddings` deletes all embeddings from the vector database if a - * confirmation is provided. - * @param {boolean} [areYouSure=false] - The `areYouSure` parameter is a boolean parameter that - * serves as a confirmation flag. It is used to ensure that the deletion of all embeddings is - * intentional and requires the caller to explicitly confirm by passing `true` as the value. If - * `areYouSure` is `false`, a warning message is logged. - * @returns The `deleteAllEmbeddings` function returns a boolean value indicating the result. + * The function `deleteLoader` deletes embeddings from a loader after confirming the action. + * @param {string} uniqueLoaderId - The `uniqueLoaderId` parameter is a string that represents the + * identifier of the loader that you want to delete. + * @returns The `deleteLoader` method returns a boolean value indicating the success of the operation. */ - public async deleteAllEmbeddings(areYouSure = false) { - if (!areYouSure) { - console.warn('Reset embeddings called without confirmation. No action taken.'); - return false; - } + public async deleteLoader(uniqueLoaderId: string) { + const deleteResult = await this.vectorDb.deleteKeys(uniqueLoaderId); + if (this.cache && deleteResult) await this.cache.deleteLoader(uniqueLoaderId); + this.loaders = this.loaders.filter((x) => x.getUniqueId() != uniqueLoaderId); + return deleteResult; + } + /** + * The function `reset` deletes all embeddings from the vector database if a + * confirmation is provided. + * @returns The `reset` function returns a boolean value indicating the result. + */ + public async reset() { await this.vectorDb.reset(); return true; } @@ -359,12 +338,12 @@ export class RAGApplication { } /** - * The getContext function retrieves the unique embeddings for a given query without calling a LLM. + * The `search` function retrieves the unique embeddings for a given query without calling a LLM. * @param {string} query - The `query` parameter is a string that represents the input query that * needs to be processed. * @returns An array of unique page content items / chunks. */ - public async getContext(query: string) { + public async search(query: string) { const cleanQuery = cleanString(query); const rawContext = await this.getEmbeddings(cleanQuery); @@ -394,7 +373,7 @@ export class RAGApplication { } if (!customContext) { - customContext = await this.getContext(userQuery); + customContext = await this.search(userQuery); } const sources = [...new Set(customContext.map((chunk) => chunk.metadata.source))]; diff --git a/databases/embedjs-lmdb/src/lmdb-cache.ts b/databases/embedjs-lmdb/src/lmdb-cache.ts index cae11483..6a543f43 100644 --- a/databases/embedjs-lmdb/src/lmdb-cache.ts +++ b/databases/embedjs-lmdb/src/lmdb-cache.ts @@ -1,4 +1,4 @@ -import { BaseCache } from '@llm-tools/embedjs-interfaces'; +import { BaseCache, Conversation, Message } from '@llm-tools/embedjs-interfaces'; import * as lmdb from 'lmdb'; export class LmdbCache implements BaseCache { @@ -47,4 +47,30 @@ export class LmdbCache implements BaseCache { async loaderCustomDelete(loaderCombinedId: string): Promise { await this.database.remove(loaderCombinedId); } + + async addConversation(conversationId: string): Promise { + await this.database.put(`conversation_${conversationId}`, { conversationId, entries: [] }); + } + + async getConversation(conversationId: string): Promise { + return this.database.get(`conversation_${conversationId}`); + } + + async hasConversation(conversationId: string): Promise { + return this.database.doesExist(`conversation_${conversationId}`); + } + + async deleteConversation(conversationId: string): Promise { + await this.database.remove(`conversation_${conversationId}`); + } + + async addEntryToConversation(conversationId: string, entry: Message): Promise { + const conversation = await this.getConversation(`conversation_${conversationId}`); + conversation.entries.push(entry); + await this.database.put(`conversation_${conversationId}`, conversation); + } + + async clearConversations(): Promise { + throw new Error('Method not implemented.'); + } } diff --git a/databases/embedjs-mongodb/src/index.ts b/databases/embedjs-mongodb/src/index.ts index ba6eb43c..aceff751 100644 --- a/databases/embedjs-mongodb/src/index.ts +++ b/databases/embedjs-mongodb/src/index.ts @@ -1,3 +1,2 @@ export * from './mongo-cache.js'; export * from './mongo-db.js'; -export * from './mongo-conversations.js'; diff --git a/databases/embedjs-mongodb/src/mongo-cache.ts b/databases/embedjs-mongodb/src/mongo-cache.ts index 943f05b7..555a31e9 100644 --- a/databases/embedjs-mongodb/src/mongo-cache.ts +++ b/databases/embedjs-mongodb/src/mongo-cache.ts @@ -1,18 +1,26 @@ -import { BaseCache } from '@llm-tools/embedjs-interfaces'; import createDebugMessages from 'debug'; import { Collection, Document, MongoClient } from 'mongodb'; +import { BaseCache, Conversation, Message } from '@llm-tools/embedjs-interfaces'; + +interface ConversationDocument { + _id?: string; // optional MongoDB ID field + conversationId: string; + entries: Message[]; // Explicitly stating this is an array of ConversationHistory +} export class MongoCache implements BaseCache { private readonly debug = createDebugMessages('embedjs:cache:MongoCache'); private readonly uri: string; private readonly dbName: string; - private readonly collectionName: string; - private collection: Collection; + private readonly cacheCollectionName: string; + private cacheCollection: Collection; + private readonly conversationCollectionName: string; + private conversationCollection: Collection; constructor({ uri, dbName, collectionName }: { uri: string; dbName: string; collectionName: string }) { this.uri = uri; this.dbName = dbName; - this.collectionName = collectionName; + this.cacheCollectionName = collectionName; } async init(): Promise { @@ -20,57 +28,113 @@ export class MongoCache implements BaseCache { await client.connect(); // Create index on loaderId field - this.collection = client.db(this.dbName).collection(this.collectionName); + this.cacheCollection = client.db(this.dbName).collection(this.cacheCollectionName); try { - await this.collection.createIndex({ loaderId: 1 }, { unique: true }); + await this.cacheCollection.createIndex({ loaderId: 1 }, { unique: true }); } catch { this.debug('Index on loaderId already exists.'); } + + // Create index on conversationId field + this.conversationCollection = client + .db(this.dbName) + .collection(this.conversationCollectionName); + try { + await this.conversationCollection.createIndex({ conversationId: 1 }); + } catch { + this.debug('Index on conversationId already exists.'); + } + // Create index on entries._id field + try { + await this.conversationCollection.createIndex({ 'entries._id': 1 }); + } catch { + this.debug('Index on `entries._id` already exists.'); + } } async addLoader(loaderId: string, chunkCount: number): Promise { - await this.collection.insertOne({ loaderId, chunkCount }); + await this.cacheCollection.insertOne({ loaderId, chunkCount }); } async getLoader(loaderId: string): Promise<{ chunkCount: number }> { - const result = await this.collection.findOne({ loaderId }); + const result = await this.cacheCollection.findOne({ loaderId }); return { chunkCount: result ? result.chunkCount : 0 }; // Assuming a default value of 0 if result is null } async hasLoader(loaderId: string): Promise { - return !!(await this.collection.findOne({ loaderId })); + return !!(await this.cacheCollection.findOne({ loaderId })); } async loaderCustomSet>(loaderCombinedId: string, value: T): Promise { - const result = await this.collection.updateOne( + const result = await this.cacheCollection.updateOne( { loaderId: loaderCombinedId }, { $setOnInsert: { loaderId: loaderCombinedId, value } }, { upsert: false }, ); if (result.matchedCount === 0) { - await this.collection.insertOne({ loaderId: loaderCombinedId, value }); + await this.cacheCollection.insertOne({ loaderId: loaderCombinedId, value }); } } async loaderCustomGet>(loaderCombinedId: string): Promise { - const result = await this.collection.findOne({ loaderId: loaderCombinedId }); + const result = await this.cacheCollection.findOne({ loaderId: loaderCombinedId }); return result?.value; } async loaderCustomHas(loaderCombinedId: string): Promise { - return !!(await this.collection.findOne({ loaderId: loaderCombinedId })); + return !!(await this.cacheCollection.findOne({ loaderId: loaderCombinedId })); } async clear(): Promise { - await this.collection.deleteMany({}); + await this.cacheCollection.deleteMany({}); } async deleteLoader(loaderId: string): Promise { - await this.collection.deleteOne({ loaderId }); + await this.cacheCollection.deleteOne({ loaderId }); } async loaderCustomDelete(loaderCombinedId: string): Promise { - await this.collection.deleteOne({ loaderId: loaderCombinedId }); + await this.cacheCollection.deleteOne({ loaderId: loaderCombinedId }); + } + + async addConversation(conversationId: string): Promise { + // Check if conversation already exists to prevent duplication + const exists = await this.hasConversation(conversationId); + if (!exists) { + await this.conversationCollection.insertOne({ conversationId, entries: [] }); + } + } + + async getConversation(conversationId: string): Promise { + const document = await this.conversationCollection.findOne({ conversationId }); + if (!document) { + // If not found, create a new one automatically + await this.addConversation(conversationId); + return { conversationId, entries: [] }; + } + return { + conversationId: document.conversationId, + entries: document.entries as Message[], + }; + } + + async hasConversation(conversationId: string): Promise { + return !!(await this.conversationCollection.findOne({ conversationId })); + } + + async deleteConversation(conversationId: string): Promise { + await this.conversationCollection.deleteOne({ conversationId }); + } + + async addEntryToConversation(conversationId: string, entry: Message): Promise { + await this.conversationCollection.updateOne( + { conversationId }, + { $push: { entries: entry } }, // Correctly structured $push operation + ); + } + + async clearConversations(): Promise { + await this.conversationCollection.deleteMany({}); } } diff --git a/databases/embedjs-mongodb/src/mongo-conversations.ts b/databases/embedjs-mongodb/src/mongo-conversations.ts deleted file mode 100644 index 567249ff..00000000 --- a/databases/embedjs-mongodb/src/mongo-conversations.ts +++ /dev/null @@ -1,82 +0,0 @@ -import createDebugMessages from 'debug'; -import { Collection, MongoClient } from 'mongodb'; -import { BaseConversation, Conversation, Message } from '@llm-tools/embedjs-interfaces'; - -interface ConversationDocument { - _id?: string; // optional MongoDB ID field - conversationId: string; - entries: Message[]; // Explicitly stating this is an array of ConversationHistory -} - -export class MongoConversation implements BaseConversation { - private readonly debug = createDebugMessages('embedjs:conversation:MongoConversation'); - private readonly uri: string; - private readonly dbName: string; - private readonly collectionName: string; - private collection: Collection; - - constructor({ uri, dbName, collectionName }: { uri: string; dbName: string; collectionName: string }) { - this.uri = uri; - this.dbName = dbName; - this.collectionName = collectionName; - } - - async init(): Promise { - const client = new MongoClient(this.uri); - await client.connect(); - - this.collection = client.db(this.dbName).collection(this.collectionName); - - try { - await this.collection.createIndex({ conversationId: 1 }); - } catch { - this.debug('Index on conversationId already exists.'); - } - - try { - await this.collection.createIndex({ 'entries._id': 1 }); - } catch { - this.debug('Index on `entries._id` already exists.'); - } - } - - async addConversation(conversationId: string): Promise { - // Check if conversation already exists to prevent duplication - const exists = await this.hasConversation(conversationId); - if (!exists) { - await this.collection.insertOne({ conversationId, entries: [] }); - } - } - - async getConversation(conversationId: string): Promise { - const document = await this.collection.findOne({ conversationId }); - if (!document) { - // If not found, create a new one automatically - await this.addConversation(conversationId); - return { conversationId, entries: [] }; - } - return { - conversationId: document.conversationId, - entries: document.entries as Message[], - }; - } - - async hasConversation(conversationId: string): Promise { - return !!(await this.collection.findOne({ conversationId })); - } - - async deleteConversation(conversationId: string): Promise { - await this.collection.deleteOne({ conversationId }); - } - - async addEntryToConversation(conversationId: string, entry: Message): Promise { - await this.collection.updateOne( - { conversationId }, - { $push: { entries: entry } }, // Correctly structured $push operation - ); - } - - async clearConversations(): Promise { - await this.collection.deleteMany({}); - } -} diff --git a/databases/embedjs-redis/src/redis-cache.ts b/databases/embedjs-redis/src/redis-cache.ts index 4637802d..4428efa5 100644 --- a/databases/embedjs-redis/src/redis-cache.ts +++ b/databases/embedjs-redis/src/redis-cache.ts @@ -1,4 +1,4 @@ -import { BaseCache } from '@llm-tools/embedjs-interfaces'; +import { BaseCache, Conversation, Message } from '@llm-tools/embedjs-interfaces'; import { Redis, RedisOptions } from 'ioredis'; export class RedisCache implements BaseCache { @@ -51,4 +51,33 @@ export class RedisCache implements BaseCache { async loaderCustomDelete(loaderCombinedId: string): Promise { await this.redis.del(loaderCombinedId); } + + async addConversation(conversationId: string): Promise { + await this.redis.set(`conversation_${conversationId}`, JSON.stringify({ conversationId, entries: [] })); + } + + async getConversation(conversationId: string): Promise { + const result = await this.redis.get(`conversation_${conversationId}`); + + if (!result) throw new Error('Conversation not found'); + return JSON.parse(result); + } + + async hasConversation(conversationId: string): Promise { + return !!(await this.redis.get(`conversation_${conversationId}`)); + } + + async deleteConversation(conversationId: string): Promise { + await this.redis.del(`conversation_${conversationId}`); + } + + async addEntryToConversation(conversationId: string, entry: Message): Promise { + const conversation = await this.getConversation(conversationId); + conversation.entries.push(entry); + await this.redis.set(`conversation_${conversationId}`, JSON.stringify(conversation)); + } + + clearConversations(): Promise { + throw new Error('Method not implemented.'); + } } diff --git a/docs/README.md b/docs/README.md index 4cbe0750..676c9447 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,31 +2,25 @@ Click on `Use this template` to copy the Mintlify starter kit. The starter kit contains examples including -- Guide pages -- Navigation -- Customizations -- API Reference pages -- Use of popular components +- Guide pages +- Navigation +- Customizations +- API Reference pages +- Use of popular components ### Development -Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation changes locally. To install, use the following command +Run the following command from the `docs` folder (where mint.json is) ``` -npm i -g mintlify -``` - -Run the following command at the root of your documentation (where mint.json is) - -``` -mintlify dev +npx mintlify dev ``` ### Publishing Changes -Install our Github App to auto propagate changes from your repo to your deployment. Changes will be deployed to production automatically after pushing to the default branch. Find the link to install on your dashboard. +Changes will be deployed to production automatically after PR is merged. #### Troubleshooting -- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies. -- Page loads as a 404 - Make sure you are running in a folder with `mint.json` +- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies. +- Page loads as a 404 - Make sure you are running in a folder with `mint.json` diff --git a/docs/_snippets/get-help.mdx b/docs/_snippets/get-help.mdx new file mode 100644 index 00000000..cc6eaf50 --- /dev/null +++ b/docs/_snippets/get-help.mdx @@ -0,0 +1,5 @@ + + + Join our slack community + + diff --git a/docs/_snippets/missing-cache-tip.mdx b/docs/_snippets/missing-cache-tip.mdx new file mode 100644 index 00000000..6e34a1df --- /dev/null +++ b/docs/_snippets/missing-cache-tip.mdx @@ -0,0 +1,14 @@ +

+ If you can't find specific feature or run into issues, please feel free to reach out through the following channels. +

+ + + + Open an issue on our GitHub + + diff --git a/docs/_snippets/missing-data-source-tip.mdx b/docs/_snippets/missing-data-source-tip.mdx new file mode 100644 index 00000000..74cd65e1 --- /dev/null +++ b/docs/_snippets/missing-data-source-tip.mdx @@ -0,0 +1,15 @@ +

+ If you can't find the specific data source, please feel free to request through one of the following channels and + help us prioritize. +

+ + + + Open an issue on our GitHub + + diff --git a/docs/_snippets/missing-model-tip.mdx b/docs/_snippets/missing-model-tip.mdx new file mode 100644 index 00000000..2e22f566 --- /dev/null +++ b/docs/_snippets/missing-model-tip.mdx @@ -0,0 +1,15 @@ +

+ If you can't find the specific LLM you need, no need to fret. We're continuously expanding our support for + additional LLMs, and you can help us prioritize by opening an issue on our GitHub. +

+ + + + Open an issue on our GitHub + + diff --git a/docs/_snippets/missing-vector-db-tip.mdx b/docs/_snippets/missing-vector-db-tip.mdx new file mode 100644 index 00000000..6e34a1df --- /dev/null +++ b/docs/_snippets/missing-vector-db-tip.mdx @@ -0,0 +1,14 @@ +

+ If you can't find specific feature or run into issues, please feel free to reach out through the following channels. +

+ + + + Open an issue on our GitHub + + diff --git a/docs/api-reference/endpoint/create.mdx b/docs/api-reference/endpoint/create.mdx deleted file mode 100644 index 5689f1b6..00000000 --- a/docs/api-reference/endpoint/create.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: 'Create Plant' -openapi: 'POST /plants' ---- diff --git a/docs/api-reference/endpoint/delete.mdx b/docs/api-reference/endpoint/delete.mdx deleted file mode 100644 index 657dfc87..00000000 --- a/docs/api-reference/endpoint/delete.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: 'Delete Plant' -openapi: 'DELETE /plants/{id}' ---- diff --git a/docs/api-reference/endpoint/get.mdx b/docs/api-reference/endpoint/get.mdx deleted file mode 100644 index 56aa09ec..00000000 --- a/docs/api-reference/endpoint/get.mdx +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: 'Get Plants' -openapi: 'GET /plants' ---- diff --git a/docs/api-reference/introduction.mdx b/docs/api-reference/introduction.mdx deleted file mode 100644 index c835b78b..00000000 --- a/docs/api-reference/introduction.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: 'Introduction' -description: 'Example section for showcasing API endpoints' ---- - - - If you're not looking to build API reference documentation, you can delete - this section by removing the api-reference folder. - - -## Welcome - -There are two ways to build API documentation: [OpenAPI](https://mintlify.com/docs/api-playground/openapi/setup) and [MDX components](https://mintlify.com/docs/api-playground/mdx/configuration). For the starter kit, we are using the following OpenAPI specification. - - - View the OpenAPI specification file - - -## Authentication - -All API endpoints are authenticated using Bearer tokens and picked up from the specification file. - -```json -"security": [ - { - "bearerAuth": [] - } -] -``` diff --git a/docs/api-reference/methods/add-loader.mdx b/docs/api-reference/methods/add-loader.mdx new file mode 100644 index 00000000..7c899a71 --- /dev/null +++ b/docs/api-reference/methods/add-loader.mdx @@ -0,0 +1,51 @@ +--- +title: '📊 addLoader' +--- + +The `addLoader()` method is used to load the data sources from different data sources to a RAG pipeline. You can find the signature below: + +### Parameters + + + The data to embed, can be a URL, local file or raw content, depending on the data type.. You can find the full list of supported data sources [here](/components/data-sources/overview). + + +## Usage + +### Load data from webpage + +```ts Code example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +await app.addLoader(new WebLoader({ urlOrContent: 'https://www.forbes.com/profile/elon-musk' })); +//Add loader completed with 4 new entries for 6c8d1a7b-ea34-4927-8823-xba29dcfc5ac +``` + +### Load data from sitemap + +```ts Code example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { SitemapLoader } from '@llm-tools/embedjs-loader-sitemap'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +await app.addLoader(new SitemapLoader({ url: '"https://js.langchain.com/sitemap.xml' })); +//Add loader completed with 11024 new entries for 6c8d1a7b-ea34-4927-8823-xba29dcfc5ad +``` + +You can find complete list of supported data sources [here](/components/data-sources/overview). diff --git a/docs/api-reference/methods/delete-loader.mdx b/docs/api-reference/methods/delete-loader.mdx new file mode 100644 index 00000000..e2e02494 --- /dev/null +++ b/docs/api-reference/methods/delete-loader.mdx @@ -0,0 +1,44 @@ +--- +title: 🗑 deleteLoader +--- + +The `deleteLoader()` method allows you to delete the data loaded by a loader previously added to the app. + +### Parameters + + + The loader unique id that is generated when the loader is added to the app. + + +### Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { RedisCache } from '@llm-tools/embedjs-redis'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; +import { SitemapLoader } from '@llm-tools/embedjs-loader-sitemap'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.setCache( + new RedisCache({ + host: this.configService.get('REDIS_HOST'), + port: this.configService.get('REDIS_PORT'), + password: this.configService.get('REDIS_PASSWORD'), + }), +) +.build(); + +const { uniqueId: forbesId } = await app.addLoader(new WebLoader({ urlOrContent: 'https://www.forbes.com/profile/elon-musk' })); +const { uniqueId: sitemapId } = await app.addLoader(new SitemapLoader({ url: '"https://js.langchain.com/sitemap.xml' })); + +await app.deleteLoader(forbesId); +``` + + + If you do not have the uniqueId, you can use `app.getLoaders()` method to get all the loaders and extract the `uniqueId` from it. + diff --git a/docs/api-reference/methods/get-loaders.mdx b/docs/api-reference/methods/get-loaders.mdx new file mode 100644 index 00000000..292579cf --- /dev/null +++ b/docs/api-reference/methods/get-loaders.mdx @@ -0,0 +1,54 @@ +--- +title: 📄 getLoaders +--- + +The `getLoaders()` method returns a list of all the data sources / loaders added so far. +This data comes from the cache and if the cache is inMemory, then the list will not include the loaders from before the restart. + + +### Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { RedisCache } from '@llm-tools/embedjs-redis'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; +import { SitemapLoader } from '@llm-tools/embedjs-loader-sitemap'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.setCache( + new RedisCache({ + host: this.configService.get('REDIS_HOST'), + port: this.configService.get('REDIS_PORT'), + password: this.configService.get('REDIS_PASSWORD'), + }), +) +.build(); + +await app.addLoader(new WebLoader({ urlOrContent: 'https://www.forbes.com/profile/elon-musk' })); +await app.addLoader(new SitemapLoader({ url: '"https://js.langchain.com/sitemap.xml' })); + +console.log(await app.getLoaders()) +/* +[ + { + "uniqueId": "6c8d1a7b-ea34-4927-8823-xba29dcfc5ac", + "type": "WebLoader", + loaderMetadata: { + urlOrContent: "https://www.forbes.com/profile/elon-musk" + } + }, + { + "uniqueId": "6c8d1a7b-ea34-4927-8823-xba29dcfc5ad", + "type": "SitemapLoader", + loaderMetadata: { + url: "https://www.forbes.com/profile/elon-musk" + } + } +] +*/ +``` diff --git a/docs/api-reference/methods/query.mdx b/docs/api-reference/methods/query.mdx new file mode 100644 index 00000000..e0853f38 --- /dev/null +++ b/docs/api-reference/methods/query.mdx @@ -0,0 +1,96 @@ +--- +title: '❓ query' +--- + +The `.query()` method empowers developers to ask questions and receive relevant answers through a user-friendly query API. +Function signature is given below: + +### Parameters + + + Question to ask + + + The conversation ID to which the query belongs in case this is a chatbot scenario + + + In case you want to pass along your own context information. Passing this parameter disables the default context generation. + + + The context text that is passed to the LLM + + + The metadata that is passed to EmbedJs + + + Unique identifier for the bit of information + + + The unique identifier for the group of information bits + + + The source string returned if this piece of info was used by the LLM + + + + + + +### Returns + + + Unique identifier for the query response in a conversation + + + Unique identifier for the query response in a conversation + + + Unique identifier for the query response in a conversation + + + The individual sources that were used to generate the answer + + + Unique identifier for the loader + + + The source of the information + + + + + The number of tokens used to answer the query + + + The number of input tokens used to process the query + + + The number of output tokens used to process the query + + + + +## Usage + +If you want to get the answer to question and return both answer and citations, use the following code snippet: + +```ts Code Example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OllamaEmbeddings } from '@llm-tools/embedjs-ollama'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const ragApplication = await new RAGApplicationBuilder() +.setModel(new Ollama({ modelName: "llama3.2", baseUrl: 'http://localhost:11434' })) +.setEmbeddingModel(new OllamaEmbeddings({ model: 'nomic-embed-text', baseUrl: 'http://localhost:11434' })) +.setVectorDb(new HNSWDb()) +.build(); + +ragApplication.addLoader({ urlOrContent: 'https://www.forbes.com/profile/elon-musk' }) +ragApplication.addLoader({ urlOrContent: 'https://en.wikipedia.org/wiki/Elon_Musk' }) + +await ragApplication.query('What is the net worth of Elon Musk today?') +/* + +*/ +``` diff --git a/docs/api-reference/methods/reset.mdx b/docs/api-reference/methods/reset.mdx new file mode 100644 index 00000000..8a9ec6a0 --- /dev/null +++ b/docs/api-reference/methods/reset.mdx @@ -0,0 +1,22 @@ +--- +title: 🔄 reset +--- + +The `reset()` method allows you to wipe the data from your RAG application and start from scratch. + +## Usage + +```ts Code example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +await app.reset(); +``` diff --git a/docs/api-reference/methods/search.mdx b/docs/api-reference/methods/search.mdx new file mode 100644 index 00000000..6565ca26 --- /dev/null +++ b/docs/api-reference/methods/search.mdx @@ -0,0 +1,89 @@ +--- +title: '🔍 search' +--- + +The `.search()` enables you to uncover the most pertinent context by performing a semantic search across your data sources based on a given query. +Refer to the function signature below: + +### Parameters + + + Question + + +### Returns + + + The list of relevant information + + + The context text that is passed to the LLM + + + The metadata that was passed to EmbedJs + + + Unique identifier for the bit of information + + + The unique identifier for the group of information bits + + + The source string + + + + + + +## Usage + +Refer to the following example on how to use the search api: + +```ts Code example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OllamaEmbeddings } from '@llm-tools/embedjs-ollama'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { SitemapLoader } from '@llm-tools/embedjs-loader-sitemap'; + +const ragApplication = await new RAGApplicationBuilder() +.setModel(new Ollama({ modelName: "llama3.2", baseUrl: 'http://localhost:11434' })) +.setEmbeddingModel(new OllamaEmbeddings({ model: 'nomic-embed-text', baseUrl: 'http://localhost:11434' })) +.setVectorDb(new HNSWDb()) +.build(); + +//Add Next.JS Website and docs +app.addLoader(new SitemapLoader({ url: "https://nextjs.org/sitemap.xml" })) + +app.search("Summarize the features of Next.js 14?") +/*[ + { + 'score': 0.99, + 'pageContent': 'Next.js 14 | Next.jsBack to BlogThursday, October 26th 2023Next.js 14Posted byLee Robinson@leeerobTim Neutkens@timneutkensAs we announced at Next.js Conf, Next.js 14 is our most focused release with: Turbopack: 5,000 tests passing for App & Pages Router 53% faster local server startup 94% faster code updates with Fast Refresh Server Actions (Stable): Progressively enhanced mutations Integrated with caching & revalidating Simple function calls, or works natively with forms Partial Prerendering', + 'metadata': { + 'id': '6c8d1a7b-ea34-4927-8823-daa29dcfc5af', + 'uniqueLoaderId': '6c8d1a7b-ea34-4927-8823-xba29dcfc5ac', + 'source': 'https://nextjs.org/blog/next-14' + } + }, + { + 'score': 0.98, + 'pageContent': 'Next.js 13.3 | Next.jsBack to BlogThursday, April 6th 2023Next.js 13.3Posted byDelba de Oliveira@delba_oliveiraTim Neutkens@timneutkensNext.js 13.3 adds popular community-requested features, including: File-Based Metadata API: Dynamically generate sitemaps, robots, favicons, and more. Dynamic Open Graph Images: Generate OG images using JSX, HTML, and CSS. Static Export for App Router: Static / Single-Page Application (SPA) support for Server Components. Parallel Routes and Interception: Advanced', + 'metadata': { + 'id': '6c8d1a7b-ea34-4927-8823-daa29dcfc5a1', + 'uniqueLoaderId': '6c8d1a7b-ea34-4927-8823-xba29dcfc5ae', + 'source': 'https://nextjs.org/blog/next-13-3' + } + }, + { + 'score': 0.98, + 'pageContent': 'Upgrading: Version 14 | Next.js MenuUsing App RouterFeatures available in /appApp Router.UpgradingVersion 14Version 14 Upgrading from 13 to 14 To update to Next.js version 14, run the following command using your preferred package manager: Terminalnpm i next@latest react@latest react-dom@latest eslint-config-next@latest Terminalyarn add next@latest react@latest react-dom@latest eslint-config-next@latest Terminalpnpm up next react react-dom eslint-config-next -latest Terminalbun add next@latest', + 'metadata': { + 'id': '6c8d1a7b-ea34-4927-8823-daa29dcfc5a2', + 'uniqueLoaderId': '6c8d1a7b-ea34-4927-8823-xba29dcfc5ad', + 'source': 'https://nextjs.org/docs/app/building-your-application/upgrading/version-14' + } + } +]*/ +``` diff --git a/docs/api-reference/openapi.json b/docs/api-reference/openapi.json deleted file mode 100644 index b1509be0..00000000 --- a/docs/api-reference/openapi.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "openapi": "3.0.1", - "info": { - "title": "OpenAPI Plant Store", - "description": "A sample API that uses a plant store as an example to demonstrate features in the OpenAPI specification", - "license": { - "name": "MIT" - }, - "version": "1.0.0" - }, - "servers": [ - { - "url": "http://sandbox.mintlify.com" - } - ], - "security": [ - { - "bearerAuth": [] - } - ], - "paths": { - "/plants": { - "get": { - "description": "Returns all plants from the system that the user has access to", - "parameters": [ - { - "name": "limit", - "in": "query", - "description": "The maximum number of results to return", - "schema": { - "type": "integer", - "format": "int32" - } - } - ], - "responses": { - "200": { - "description": "Plant response", - "content": { - "application/json": { - "schema": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Plant" - } - } - } - } - }, - "400": { - "description": "Unexpected error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - } - } - }, - "post": { - "description": "Creates a new plant in the store", - "requestBody": { - "description": "Plant to add to the store", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/NewPlant" - } - } - }, - "required": true - }, - "responses": { - "200": { - "description": "plant response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Plant" - } - } - } - }, - "400": { - "description": "unexpected error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - } - } - } - }, - "/plants/{id}": { - "delete": { - "description": "Deletes a single plant based on the ID supplied", - "parameters": [ - { - "name": "id", - "in": "path", - "description": "ID of plant to delete", - "required": true, - "schema": { - "type": "integer", - "format": "int64" - } - } - ], - "responses": { - "204": { - "description": "Plant deleted", - "content": {} - }, - "400": { - "description": "unexpected error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Error" - } - } - } - } - } - } - } - }, - "components": { - "schemas": { - "Plant": { - "required": [ - "name" - ], - "type": "object", - "properties": { - "name": { - "description": "The name of the plant", - "type": "string" - }, - "tag": { - "description": "Tag to specify the type", - "type": "string" - } - } - }, - "NewPlant": { - "allOf": [ - { - "$ref": "#/components/schemas/Plant" - }, - { - "required": [ - "id" - ], - "type": "object", - "properties": { - "id": { - "description": "Identification number of the plant", - "type": "integer", - "format": "int64" - } - } - } - ] - }, - "Error": { - "required": [ - "error", - "message" - ], - "type": "object", - "properties": { - "error": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - } - } - } - }, - "securitySchemes": { - "bearerAuth": { - "type": "http", - "scheme": "bearer" - } - } - } -} \ No newline at end of file diff --git a/docs/api-reference/overview.mdx b/docs/api-reference/overview.mdx new file mode 100644 index 00000000..1570b9f6 --- /dev/null +++ b/docs/api-reference/overview.mdx @@ -0,0 +1,55 @@ +--- +title: "RAGApplicationBuilder" +--- + +Create a EmbedJs `RAGApplication` using `RAGApplicationBuilder`. `RAGApplication` is the main entrypoint for a developer to interact with EmbedJs APIs. +`RAGApplicationBuilder` configures the LLM, vector database and embedding model of your choice and return a `RAGApplication` at the end. + +### Attributes + + + This configures the LLM for the RAG application. Setting `NO_MODEL` will not load any LLM - in this case, you can only use semantic search and there will be no no LLM powered Q&A. + `SIMPLE_MODELS` are predefined models with sane defaults available in EmbedJs. + All predefined models inherit from `BaseModel`. You can therefore pass a custom model that extends `BaseModel` / provide a custom set of parameters for a predefined model. + For a list of predefined LLMs, refer the section on [LLMs](/components/llms). + + + This configures the embedding model for use with the RAG application. Embedding models are used to convert text into vectors. + For a list of predefined embedding models, refer the section on [embedding models](/components/embedding-models). + + + This configures the vector database to be used with RAG application. + For a list of available vector databases, refer the section on [vector databases](/components/vector-databases). + + + This configures a cache that is used internally by the appliation to keep track of what sources and data have been previously processed. + Previously processed data is not reprocessed - thus removing the need for this logic to be implemented at your end. + If this is not provided, the application will maintain in memory this cache which will be lost on app restart. + For a list of available caches, refer the section on [caches](/components/caches). + + + This configures a temperature to be used with the LLM. This controls the randomness of the LLM output. + By default, the application sets the temperature to 0.1. + + + This parameter is used to control what amounts to a relevant / contextual document when retrieving documents from the vector database. + Documents below this cut off are not discarded. EmbedJs uses sane defaults for this parameter but you can customize. + + + This allows you to customize the query template used when querying the LLM. + + +## Usage + +```ts Code Example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +//app is of type RAGApplication +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); +``` diff --git a/docs/components/caches/lmdb.mdx b/docs/components/caches/lmdb.mdx new file mode 100644 index 00000000..1babff65 --- /dev/null +++ b/docs/components/caches/lmdb.mdx @@ -0,0 +1,24 @@ +--- +title: LMDB +--- + +You can use [LMDB](https://dbdb.io/db/lmdb) to cache values locally on disk. + +## Install LMDB addon + +```bash +npm install @llm-tools/embedjs-lmdb +``` + +## Usage + +```ts Partial example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { LmdbCache } from '@llm-tools/embedjs-lmdb'; + +const app = await new RAGApplicationBuilder() +.setCache(new LmdbCache({ path: path.resolve('./cache') })) +``` + + + diff --git a/docs/components/caches/mongodb.mdx b/docs/components/caches/mongodb.mdx new file mode 100644 index 00000000..d88a178e --- /dev/null +++ b/docs/components/caches/mongodb.mdx @@ -0,0 +1,28 @@ +--- +title: MongoDB +--- + +You can use MongoDB as a cache / datastore. This creates two new collections in the database - which are configureable. + + +MongoDB is also supported as a store for the vector data. This is separate from that. + + +## Install MongoDB addon + +```bash +npm install @llm-tools/embedjs-mongodb +``` + +## Usage + +```ts Partial example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { MongoCache } from '@llm-tools/embedjs-mongodb'; + +const app = await new RAGApplicationBuilder() +.setCache(new MongoCache({ ... })) +``` + + + diff --git a/docs/components/caches/overview.mdx b/docs/components/caches/overview.mdx new file mode 100644 index 00000000..52f20461 --- /dev/null +++ b/docs/components/caches/overview.mdx @@ -0,0 +1,21 @@ +--- +title: Overview +--- + +EmbedJs comes with built-in support for data persistance beyond vector embeddings. The kind of data that can be persisted includes - + +- Loaders and chunks loaded and their metadata +- Loader specific caching +- Conversation history + +The library handles the complexity of being able to swap the data persistance layer by the abstraction of caching. The following caches are supported - + + + + + + + +
+ + diff --git a/docs/components/caches/redis.mdx b/docs/components/caches/redis.mdx new file mode 100644 index 00000000..bda3e49b --- /dev/null +++ b/docs/components/caches/redis.mdx @@ -0,0 +1,24 @@ +--- +title: Redis +--- + +You can use redis as a cache / datastore. + +## Install Redis addon + +```bash +npm install @llm-tools/embedjs-redis +``` + +## Usage + +```ts Partial example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { RedisCache } from '@llm-tools/embedjs-redis'; + +const app = await new RAGApplicationBuilder() +.setCache(new RedisCache({ ... })) +``` + + + diff --git a/docs/components/data-sources/csv.mdx b/docs/components/data-sources/csv.mdx new file mode 100644 index 00000000..2dbb9276 --- /dev/null +++ b/docs/components/data-sources/csv.mdx @@ -0,0 +1,48 @@ +--- +title: '📊 CSV' +--- + +You can load any csv file from your local file system or through a URL. +Headers are included for each line, so if you have an `age` column, `18` will be added as `age: 18`. + +## Install CSV addon + +```bash +npm install @llm-tools/embedjs-loader-csv +``` + +## Usage + +### Load from a local file + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { DocxLoader } from '@llm-tools/embedjs-loader-csv'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new CsvLoader({ filePathOrUrl: '/path/to/file.csv' })) +``` + +### Load from URL + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { DocxLoader } from '@llm-tools/embedjs-loader-csv'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new CsvLoader({ filePathOrUrl: 'https://people.sc.fsu.edu/~jburkardt/data/csv/airtravel.csv' })) +``` diff --git a/docs/components/data-sources/custom.mdx b/docs/components/data-sources/custom.mdx new file mode 100644 index 00000000..87baf29f --- /dev/null +++ b/docs/components/data-sources/custom.mdx @@ -0,0 +1,37 @@ +--- +title: '⚙️ Custom' +--- + +You can load any data from your own custom data source by implementing the `BaseLoader` interface. For example - + +```ts +class CustomLoader extends BaseLoader<{ customChunkMetadata: string }> { + constructor() { + super('uniqueId'); + } + + async *getChunks() { + throw new Error('Method not implemented.'); + } +} +``` + +### Customizing the chunk size and overlap + +If you want to customize the chunk size or the chunk overlap on an existing loader, all built-in loaders take an additional parameter `chunkSize` and `chunkOverlap` +in their constructor. For example - + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { DocxLoader } from '@llm-tools/embedjs-loader-msoffice'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new DocxLoader({ filePathOrUrl: '...', chunkOverlap: 100, chunkSize: 20 })) +``` diff --git a/docs/components/data-sources/directory.mdx b/docs/components/data-sources/directory.mdx new file mode 100644 index 00000000..f68c0a3b --- /dev/null +++ b/docs/components/data-sources/directory.mdx @@ -0,0 +1,26 @@ +--- +title: '📁 Directory/Folder' +--- + +To use an entire directory as data source, just use `LocalPathLoader` and pass in the path of the local directory. +This loader automatically reads all the files in the directory and its subdirectories. If you pass the path to a single file, only that file will be read. + +## Usage + +```ts +import { RAGApplicationBuilder, LocalPathLoader } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new LocalPathLoader({ path: '...' })) +``` + + +You need to have installed the neccessaty loaders to process the expected file types in the directory for the application to be able to process that file type. + diff --git a/docs/components/data-sources/docx.mdx b/docs/components/data-sources/docx.mdx new file mode 100644 index 00000000..1e612646 --- /dev/null +++ b/docs/components/data-sources/docx.mdx @@ -0,0 +1,28 @@ +--- +title: '📄 DOCX file' +--- + +You can load any docx file from your local file system or through a URL. + +## Install MSOffice addon + +```bash +npm install @llm-tools/embedjs-loader-msoffice +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { DocxLoader } from '@llm-tools/embedjs-loader-msoffice'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new DocxLoader({ filePathOrUrl: '...' })) +``` diff --git a/docs/components/data-sources/excel.mdx b/docs/components/data-sources/excel.mdx new file mode 100644 index 00000000..19297b81 --- /dev/null +++ b/docs/components/data-sources/excel.mdx @@ -0,0 +1,28 @@ +--- +title: '📄 Excel file' +--- + +You can load any xlsx file from your local file system or through a URL. + +## Install MSOffice addon + +```bash +npm install @llm-tools/embedjs-loader-msoffice +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { ExcelLoader } from '@llm-tools/embedjs-loader-msoffice'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new ExcelLoader({ filePathOrUrl: '...' })) +``` diff --git a/docs/components/data-sources/json.mdx b/docs/components/data-sources/json.mdx new file mode 100644 index 00000000..9d695dbe --- /dev/null +++ b/docs/components/data-sources/json.mdx @@ -0,0 +1,27 @@ +--- +title: '📃 JSON' +--- + +To add any json file, use the `JsonLoader`. +Headers are included for each line, so for example if you have a json like `{"age": 18}`, then it will be added as `age: 18`. + +## Usage + + + +```ts Example +import { RAGApplicationBuilder, JsonLoader } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new JsonLoader({ object: {...} })) +``` + + + diff --git a/docs/components/data-sources/overview.mdx b/docs/components/data-sources/overview.mdx new file mode 100644 index 00000000..699a8297 --- /dev/null +++ b/docs/components/data-sources/overview.mdx @@ -0,0 +1,27 @@ +--- +title: Overview +--- + +EmbedJs comes with built-in support for various data sources. +We handle the complexity of loading unstructured data from these data sources, allowing you to easily customize your app through a user-friendly interface. + + + + + + + + + + + + + + + + + + +
+ + diff --git a/docs/components/data-sources/pdf.mdx b/docs/components/data-sources/pdf.mdx new file mode 100644 index 00000000..b12320ce --- /dev/null +++ b/docs/components/data-sources/pdf.mdx @@ -0,0 +1,52 @@ +--- +title: '📰 PDF' +--- + +You can load any pdf file from your local file system or through a URL. + +## Install PDF addon + +```bash +npm install @llm-tools/embedjs-loader-pdf +``` + +## Usage + +### Load from a local file + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { PdfLoader } from '@llm-tools/embedjs-loader-pdf'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new PdfLoader({ filePathOrUrl: '/path/to/file.pdf' })) +``` + +### Load from URL + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { PdfLoader } from '@llm-tools/embedjs-loader-pdf'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +await app.addLoader(new PdfLoader({ filePathOrUrl: 'https://arxiv.org/pdf/1706.03762.pdf' })) +await app.query("What is the paper 'attention is all you need' about?"); +``` + + +Note that we do not support password protected pdf files. + diff --git a/docs/components/data-sources/ppt.mdx b/docs/components/data-sources/ppt.mdx new file mode 100644 index 00000000..bc3b67c6 --- /dev/null +++ b/docs/components/data-sources/ppt.mdx @@ -0,0 +1,28 @@ +--- +title: '📄 PPT file' +--- + +You can load any pptx file from your local file system or through a URL. + +## Install MSOffice addon + +```bash +npm install @llm-tools/embedjs-loader-msoffice +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { PptLoader } from '@llm-tools/embedjs-loader-msoffice'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new LocalPathLoader({ filePathOrUrl: '...' })) +``` diff --git a/docs/components/data-sources/sitemap.mdx b/docs/components/data-sources/sitemap.mdx new file mode 100644 index 00000000..bdac4f37 --- /dev/null +++ b/docs/components/data-sources/sitemap.mdx @@ -0,0 +1,28 @@ +--- +title: '🗺️ Sitemap' +--- + +Add all web pages from an xml-sitemap use the `SitemapLoader`. + +## Install Sitemap addon + +```bash +npm install @llm-tools/embedjs-loader-sitemap +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { SitemapLoader } from '@llm-tools/embedjs-loader-sitemap'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new SitemapLoader({ url: '...' })) +``` diff --git a/docs/components/data-sources/text.mdx b/docs/components/data-sources/text.mdx new file mode 100644 index 00000000..08099922 --- /dev/null +++ b/docs/components/data-sources/text.mdx @@ -0,0 +1,21 @@ +--- +title: '📝 Text' +--- + +Text is a local data type. To supply your own text, use the `TextLoader` and enter a string. The text is not processed, this can be very versatile. + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new TextLoader({ text: '...' })) +``` diff --git a/docs/components/data-sources/web-page.mdx b/docs/components/data-sources/web-page.mdx new file mode 100644 index 00000000..f70b8027 --- /dev/null +++ b/docs/components/data-sources/web-page.mdx @@ -0,0 +1,28 @@ +--- +title: '🌐 HTML Web page' +--- + +To add any web page, use the data_type as `WebLoader`. + +## Install Web addon + +```bash +npm install @llm-tools/embedjs-loader-web +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new WebLoader({ urlOrContent: '...' })) +``` diff --git a/docs/components/data-sources/youtube-channel.mdx b/docs/components/data-sources/youtube-channel.mdx new file mode 100644 index 00000000..18b25c08 --- /dev/null +++ b/docs/components/data-sources/youtube-channel.mdx @@ -0,0 +1,28 @@ +--- +title: '📽️ Youtube Channel' +--- + +To add all the videos from a youtube channel to your app, use the `YoutubeChannelLoader`. + +## Install Youtube addon + +```bash +npm install @llm-tools/embedjs-loader-youtube +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { YoutubeChannelLoader } from '@llm-tools/embedjs-loader-youtube'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new YoutubeChannelLoader({ youtubeChannelId: '...' })) +``` diff --git a/docs/components/data-sources/youtube-search.mdx b/docs/components/data-sources/youtube-search.mdx new file mode 100644 index 00000000..87041e75 --- /dev/null +++ b/docs/components/data-sources/youtube-search.mdx @@ -0,0 +1,28 @@ +--- +title: '🔍 Youtube Search' +--- + +To automatically perform a youtube search and load the top youtube videos to your app, use the `YoutubeSearchLoader`. + +## Install Youtube addon + +```bash +npm install @llm-tools/embedjs-loader-youtube +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { YoutubeSearchLoader } from '@llm-tools/embedjs-loader-youtube'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new YoutubeSearchLoader({ youtubeSearchString: '...' })) +``` diff --git a/docs/components/data-sources/youtube-video.mdx b/docs/components/data-sources/youtube-video.mdx new file mode 100644 index 00000000..3cea54c0 --- /dev/null +++ b/docs/components/data-sources/youtube-video.mdx @@ -0,0 +1,28 @@ +--- +title: '📺 Youtube Video' +--- + +To add any youtube video to your app, use the `YoutubeLoader`. + +## Install Youtube addon + +```bash +npm install @llm-tools/embedjs-loader-youtube +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; +import { YoutubeLoader } from '@llm-tools/embedjs-loader-youtube'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +app.addLoader(new YoutubeLoader({ videoIdOrUrl: '...' })) +``` diff --git a/docs/components/embeddings/azure-openai.mdx b/docs/components/embeddings/azure-openai.mdx new file mode 100644 index 00000000..c28b5efb --- /dev/null +++ b/docs/components/embeddings/azure-openai.mdx @@ -0,0 +1,24 @@ +--- +title: 'Azure OpenAI' +--- + +In order to be able to use an OpenAI model on Azure, it first needs to be deployed. +Refer to the [Azure OpenAI LLM install documentation](/components/llms/azure-openai) for more information. + +## Install OpenAI addon + +```bash +npm install @llm-tools/embedjs-openai +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +``` + diff --git a/docs/components/embeddings/cohere.mdx b/docs/components/embeddings/cohere.mdx new file mode 100644 index 00000000..88568b13 --- /dev/null +++ b/docs/components/embeddings/cohere.mdx @@ -0,0 +1,32 @@ +--- +title: 'Cohere' +--- + +The library supports usage of [Cohere-AI](https://cohere.com) `embed-english-v2.0` embedding model out of the box. This model returns vectors with dimension 4096. + +Here's what you have to do to use it - + +- Sign up for an account with Cohere-AI, go to the [API Keys](https://dashboard.cohere.ai/api-keys) section and copy / create an API_KEY. + +- Set the key in the environment variable `COHERE_API_KEY` + +```bash +COHERE_API_KEY="" +``` + +## Install Cohere addon + +```bash +npm install @llm-tools/embedjs-cohere +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { CohereEmbeddings } from '@llm-tools/embedjs-cohere'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new CohereEmbeddings()) +``` diff --git a/docs/components/embeddings/ollama.mdx b/docs/components/embeddings/ollama.mdx new file mode 100644 index 00000000..018eed54 --- /dev/null +++ b/docs/components/embeddings/ollama.mdx @@ -0,0 +1,27 @@ +--- +title: 'Ollama' +--- + +EmbedJs supports local embeddings via `Ollama`. Read more here [Ollama embeddings](https://ollama.com/blog/embedding-models). + +To use this, you need to setup and have Ollama working locally. Refer to their Github [here](https://github.com/ollama/ollama) to understand how to do this. +Once done, follow these steps - + +## Install Ollama addon + +```bash +npm install @llm-tools/embedjs-ollama +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OllamaEmbeddings } from '@llm-tools/embedjs-ollama'; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new OllamaEmbeddings({ + modelName: "...", + baseUrl: 'http://localhost:11434' +})) +``` diff --git a/docs/components/embeddings/openai.mdx b/docs/components/embeddings/openai.mdx new file mode 100644 index 00000000..bc8710c0 --- /dev/null +++ b/docs/components/embeddings/openai.mdx @@ -0,0 +1,36 @@ +--- +title: 'OpenAI' +--- + +To use the OpenAI embedding models, you need a API key from OpenAI. +You can alternatively use Azure OpenAI to run most of the OpenAI embedding models. Read the [Azure OpenAI](/components/llms/azure-openai) section to learn more about this. + +To get started, obtain an API Key from OpenAI. You can do this by visiting their [API Portal](https://platform.openai.com/api-keys). +Once you obtain a key, set it in an environment variable, like so - + +```bash +OPENAI_API_KEY="" +``` + +The EmbedJs OpenAI addon provides the following embedding models - + +- OpenAi3LargeEmbeddings +- OpenAi3SmallEmbeddings +- AdaEmbeddings + +## Install OpenAI addon + +```bash +npm install @llm-tools/embedjs-openai +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3LargeEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new OpenAi3LargeEmbeddings()) +``` diff --git a/docs/components/embeddings/overview.mdx b/docs/components/embeddings/overview.mdx new file mode 100644 index 00000000..a7b254a2 --- /dev/null +++ b/docs/components/embeddings/overview.mdx @@ -0,0 +1,17 @@ +--- +title: Overview +--- + +EmbedJs supports several embedding models from the following providers: + + + + + + + + + +
+ + diff --git a/docs/components/embeddings/vertexai.mdx b/docs/components/embeddings/vertexai.mdx new file mode 100644 index 00000000..9e0fb66e --- /dev/null +++ b/docs/components/embeddings/vertexai.mdx @@ -0,0 +1,25 @@ +--- +title: 'Vertex AI' +--- + +The libaray supports the Gecko Embedding model on [VertexAI](https://cloud.google.com/vertex-ai/generative-ai/docs/embeddings/get-text-embeddings) with 768 dimensions. + +To use this model, you need to authenticate to Vertex AI on GCP. Refer [here](/components/llms/azure-openai) on how to do this. Once done, follow these steps - + +## Install VertexAi addon + +```bash +npm install @llm-tools/embedjs-vertexai +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { GeckoEmbeddings } from '@llm-tools/embedjs-vertexai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new GeckoEmbeddings()) +``` + diff --git a/docs/components/introduction.mdx b/docs/components/introduction.mdx new file mode 100644 index 00000000..c9ddc739 --- /dev/null +++ b/docs/components/introduction.mdx @@ -0,0 +1,13 @@ +--- +title: EmbedJs Components +--- + +## Overview + +You can configure following components in an EmbedJs application - + +* [LLM](/components/llms) +* [Embedding Model](/components/embeddings) +* [Data Source](/components/data-sources) +* [Vector Database](/components/vector-databases) +* [Caches](/components/caches) diff --git a/docs/components/llms/anthropic.mdx b/docs/components/llms/anthropic.mdx new file mode 100644 index 00000000..6e9844d8 --- /dev/null +++ b/docs/components/llms/anthropic.mdx @@ -0,0 +1,26 @@ +--- +title: 'Anthropic' +--- + +To use Anthropic's Claude models, you will need to get an API Key from Anthropic. +You can do this from their [console](https://console.anthropic.com/settings/keys). Once you obtain a key, set it in the environment variable, like so - + +```bash +ANTHROPIC_API_KEY="" +``` + +## Install Anthtopic addon + +```bash +npm install @llm-tools/embedjs-anthropic +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { Anthropic } from '@llm-tools/embedjs-anthropic'; + +const app = await new RAGApplicationBuilder() +.setModel(new Anthropic({ modelName: "..." })) +``` diff --git a/docs/components/llms/azure-openai.mdx b/docs/components/llms/azure-openai.mdx new file mode 100644 index 00000000..d1a35f35 --- /dev/null +++ b/docs/components/llms/azure-openai.mdx @@ -0,0 +1,49 @@ +--- +title: 'Azure OpenAI' +--- + +In order to be able to use an OpenAI model on Azure, it first needs to be deployed. +Please refer to [Azure OpenAI documentation](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/) on how to deploy a model on Azure. +To run this library, you will need to deploy both an LLM and an embedding model. For example - + +- text-embedding-ada (or any of the newer models) +- GPT-3.5-turbo (or the 4 series) + +Once these models are deployed, using Azure OpenAI instead of the regular OpenAI is easy to do. Just follow these steps - + +- Remove the `OPENAI_API_KEY` environment variable if you have set it already. + +- Set the following environment variables - + +```bash +# Set this to `azure` +OPENAI_API_TYPE=azure +# The API version you want to use +AZURE_OPENAI_API_VERSION=2023-05-15 +# The base URL for your Azure OpenAI resource. You can find this in the Azure portal under your Azure OpenAI resource. +export AZURE_OPENAI_BASE_PATH=https://your-resource-name.openai.azure.com/openai/deployments +# The API key1 or key2 for your Azure OpenAI resource +export AZURE_OPENAI_API_KEY= +# The deployment name you used for your embedding model +AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME=text-embedding-ada-002 +# The deployment name you used for your llm +AZURE_OPENAI_API_DEPLOYMENT_NAME=gpt-35-turbo +``` + +The OpenAi addon can now be used as is and will automatically use the Azure OpenAI endpoint. + +## Install OpenAI addon + +```bash +npm install @llm-tools/embedjs-openai +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi } from '@llm-tools/embedjs-openai'; + +const app = await new RAGApplicationBuilder() +.setModel(new OpenAi({ modelName: "gpt-4o" })) +``` diff --git a/docs/components/llms/huggingface.mdx b/docs/components/llms/huggingface.mdx new file mode 100644 index 00000000..dac0c8d5 --- /dev/null +++ b/docs/components/llms/huggingface.mdx @@ -0,0 +1,27 @@ +--- +title: 'Hugging Face' +--- + +Hugging face needs no introduction. They host a variety of open source LLMs and you can use most of them for free. To run hugging face inference based LLMs with this library, you will need a free hugging face token. + +You can get an API Token by signing up for hugging face and generate a token from [this page](https://huggingface.co/settings/tokens). Once you get the token, set it to the environment like so - + +```bash +HUGGINGFACEHUB_API_KEY="" +``` + +## Install Huggingface addon + +```bash +npm install @llm-tools/embedjs-huggingface +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { HuggingFace } from '@llm-tools/embedjs-huggingface'; + +const app = await new RAGApplicationBuilder() +.setModel(new HuggingFace({ modelName: "..." })) +``` diff --git a/docs/components/llms/mistral.mdx b/docs/components/llms/mistral.mdx new file mode 100644 index 00000000..2627477c --- /dev/null +++ b/docs/components/llms/mistral.mdx @@ -0,0 +1,21 @@ +--- +title: 'Mistral' +--- + +To use Mirstal's models, you will need to get an API Key from Mistral. You can do this from their [console](https://console.mistral.ai/user/api-keys/). + +## Install Mistral addon + +```bash +npm install @llm-tools/embedjs-mistral +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { Anthropic } from '@llm-tools/embedjs-mistral'; + +const app = await new RAGApplicationBuilder() +.setModel(new Mistral({ accessToken: "", modelName: "..." })) +``` diff --git a/docs/components/llms/ollama.mdx b/docs/components/llms/ollama.mdx new file mode 100644 index 00000000..5f7ae65c --- /dev/null +++ b/docs/components/llms/ollama.mdx @@ -0,0 +1,25 @@ +--- +title: 'Ollama' +--- + +You can also use locally running Ollama models. Installation instructions for Ollama can be found [here](https://ollama.com/). +Once Ollama is installed, you can start a local LLM by executing `ollama run `. + +## Install Ollama addon + +```bash +npm install @llm-tools/embedjs-ollama +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { Ollama } from '@llm-tools/embedjs-ollama'; + +const app = await new RAGApplicationBuilder() +.setModel(new Ollama({ + modelName: "llama3", + baseUrl: 'http://localhost:11434' +})) +``` diff --git a/docs/components/llms/openai.mdx b/docs/components/llms/openai.mdx new file mode 100644 index 00000000..c06e2356 --- /dev/null +++ b/docs/components/llms/openai.mdx @@ -0,0 +1,29 @@ +--- +title: 'OpenAI' +--- + +To use the OpenAI LLM models, you need a API key from OpenAI. +You can alternatively use Azure OpenAI to run most of the OpenAI LLMs. Read the [Azure OpenAI](/components/llms/azure-openai) section to learn more about this. + +To get started, obtain an API Key from OpenAI. You can do this by visiting their [API Portal](https://platform.openai.com/api-keys). +Once you obtain a key, set it in an environment variable, like so - + +```bash +OPENAI_API_KEY="" +``` + +## Install OpenAI addon + +```bash +npm install @llm-tools/embedjs-openai +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi } from '@llm-tools/embedjs-openai'; + +const app = await new RAGApplicationBuilder() +.setModel(new OpenAi({ modelName: "text-davinci-003" })) +``` diff --git a/docs/components/llms/overview.mdx b/docs/components/llms/overview.mdx new file mode 100644 index 00000000..220443b0 --- /dev/null +++ b/docs/components/llms/overview.mdx @@ -0,0 +1,30 @@ +--- +title: Overview +--- + +EmbedJs comes with built-in support for various popular large language models. We handle the complexity of integrating these models for you, allowing you to easily customize your language model interactions through a user-friendly interface. + + + + + + + + + + + +
+ +## Token Usage + +The list of LLMs that support token usage are: + +- OpenAI +- Vertex AI +- Anthropic +- Mistral AI + +
+ + diff --git a/docs/components/llms/vertexai.mdx b/docs/components/llms/vertexai.mdx new file mode 100644 index 00000000..0d7b08f4 --- /dev/null +++ b/docs/components/llms/vertexai.mdx @@ -0,0 +1,38 @@ +--- +title: 'Vertex AI' +--- + +You to use Gemini LLM and other models on Google Cloud Platform via [VertexAI](https://cloud.google.com/vertex-ai?hl=en). +Read more about all the supported [LLMs](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models). + +To get started, you need to set the right access credentials to google cloud. You have two options here - + +- Authenticate by using `gcloud` CLI: + +``` +gcloud auth application-default login +``` + +- Authentication using Service Account with JSON key and environment variable: + +```bash +GOOGLE_APPLICATION_CREDENTIALS="" +``` + +Once this is done, you can configure your embedJs app - + +## Install VertexAi addon + +```bash +npm install @llm-tools/embedjs-vertexai +``` + +## Usage + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { Ollama } from '@llm-tools/embedjs-vertexai'; + +const app = await new RAGApplicationBuilder() +.setModel(new VertexAI({ modelName: 'gemini-1.5-pro-preview-0409'})) +``` diff --git a/docs/components/vector-databases/astradb.mdx b/docs/components/vector-databases/astradb.mdx new file mode 100644 index 00000000..92551667 --- /dev/null +++ b/docs/components/vector-databases/astradb.mdx @@ -0,0 +1,48 @@ +--- +title: AstraDB +--- + +[Astra DB](https://www.datastax.com/products/datastax-astra) is a document database with a highly performant vector index powered by Apache Cassandra and available as a managed service. + +To use Astra DB - + +- [Sign up](https://astra.datastax.com/signup) for an Astra DB account. It is free to sign up and doesn't require a credit card. +- Create a database (this takes a couple of minutes to provision) +- From the database overview page get the API Endpoint and generate an Application Token + +## Install AstraDB addon + +```bash +npm install @llm-tools/embedjs-astradb +``` + +## Usage + +```ts Example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { AstraDb } from '@llm-tools/embedjs-astradb'; + +// set OPENAI_API_KEY in your env +process.env.OPENAI_API_KEY = "sk-xxx"; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setVectorDb( + new AstraDb({ + endpoint: "", + apiKey: "", + collectionName: "documents" + }) +) +.build(); + + +//add data source and start query in +await app.add("https://www.forbes.com/profile/elon-musk"); +await app.query('Tell me about Elon Musk'); +``` + + + diff --git a/docs/components/vector-databases/hnswlib.mdx b/docs/components/vector-databases/hnswlib.mdx new file mode 100644 index 00000000..89f3ef98 --- /dev/null +++ b/docs/components/vector-databases/hnswlib.mdx @@ -0,0 +1,36 @@ +--- +title: HNSWLib +--- + +[HNSWLib](https://github.com/nmslib/hnswlib) is an high performance in-memory vectorstore. +It is great for testing since you do not need access to the file system or a cloud service. + +## Install HNSWLib addon + +```bash +npm install @llm-tools/embedjs-hnswlib +``` + +## Usage + +```ts Example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +// set OPENAI_API_KEY in your env +process.env.OPENAI_API_KEY = "sk-xxx"; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setVectorDb(new HNSWDb()) +.build(); + +//add data source and start query in +await app.add("https://www.forbes.com/profile/elon-musk"); +await app.query('Tell me about Elon Musk'); +``` + + + diff --git a/docs/components/vector-databases/lancedb.mdx b/docs/components/vector-databases/lancedb.mdx new file mode 100644 index 00000000..9593ac38 --- /dev/null +++ b/docs/components/vector-databases/lancedb.mdx @@ -0,0 +1,42 @@ +--- +title: LanceDB +--- + +LanceDB is a developer-friendly, open source database with great performance. +From hyper scalable vector search and advanced retrieval for RAG, to streaming training data and interactive exploration of large scale AI datasets. +You can run LanceDB locally and it is integrated into the LanceDb addon for EmbedJs. + +## Install LanceDB addon + +```bash +npm install @llm-tools/embedjs-lancedb +``` + +## Usage + +```ts Example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { LanceDb } from '@llm-tools/embedjs-lancedb'; + +// set OPENAI_API_KEY in your env +process.env.OPENAI_API_KEY = "sk-xxx"; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setVectorDb( + new LanceDb({ + path: './lmdb', + }), +) +.build(); + + +//add data source and start query in +await app.add("https://www.forbes.com/profile/elon-musk"); +await app.query('Tell me about Elon Musk'); +``` + + + diff --git a/docs/components/vector-databases/mongodb.mdx b/docs/components/vector-databases/mongodb.mdx new file mode 100644 index 00000000..bd1154c3 --- /dev/null +++ b/docs/components/vector-databases/mongodb.mdx @@ -0,0 +1,53 @@ +--- +title: MongoDB +--- + +[MongoDB](https://www.mongodb.com/products/platform/atlas-vector-search) is an open source document database. +The company behind the open source product offers a managed cloud product **MongoDB Atlas**. +As of right now, only the Atlas version supports vector search while the open source version does not. + +To use MongoDB as your vector database, follow these steps - + +- Sign up for a MongoDB Atlas account if you haven't already. Once you have signed up, you will need to spin up a new cluster (or use an existing one) + + +You will need to provision a M10 (or higher) instance type to use Atlas vector search. Cheaper instance types or the free version (M0) give an error when vector indexes are created programatically. + + +- The cluster creation takes a few minutes. Once the cluster is ready, click on the connect button on the dashboard to get the connection string. + + +You will need to add users separately and allow IP access from your relevant development and production environments. + + +## Install MongoDB addon + +```bash +npm install @llm-tools/embedjs-mongodb +``` + +## Usage + +```ts Example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { MongoDb } from '@llm-tools/embedjs-mongodb'; + +// set OPENAI_API_KEY in your env +process.env.OPENAI_API_KEY = "sk-xxx"; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +new MongoDb({ + connectionString: 'mongodb+srv://:@', +}), +.build(); + +//add data source and start query in +await app.add("https://www.forbes.com/profile/elon-musk"); +await app.query('Tell me about Elon Musk'); +``` + + + diff --git a/docs/components/vector-databases/overview.mdx b/docs/components/vector-databases/overview.mdx new file mode 100644 index 00000000..3c066839 --- /dev/null +++ b/docs/components/vector-databases/overview.mdx @@ -0,0 +1,21 @@ +--- +title: Overview +--- + +## Overview + +Utilizing a vector database alongside EmbedJs is a seamless process. +All you need to do is install the specific addon for the vector database of your choice and configure it. +We've provided examples for each supported database below: + + + + + + + + + + + + diff --git a/docs/components/vector-databases/pinecone.mdx b/docs/components/vector-databases/pinecone.mdx new file mode 100644 index 00000000..9314322a --- /dev/null +++ b/docs/components/vector-databases/pinecone.mdx @@ -0,0 +1,52 @@ +--- +title: Pinecone +--- + +To get started, create an account with [Pinecone](https://www.pinecone.io/) if you don't have one already. There is a free tier. +Once you have an account, get an API key from the **API Keys** section on the Pinecone dashboard. + +Add the API Key to your environment variables. + +```bash +PINECONE_API_KEY= +``` + +## Install Pinecone addon + +```bash +npm install @llm-tools/embedjs-pinecone +``` + +## Usage + +```ts Example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { LanceDb } from '@llm-tools/embedjs-pinecone'; + +// set OPENAI_API_KEY in your env +process.env.OPENAI_API_KEY = "sk-xxx"; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setVectorDb(new PineconeDb({ + projectName: '', + namespace: '', + indexSpec: { + pod: { + podType: 'p1.x1', + environment: 'us-east1-gcp', + }, + }, +})) +.build(); + + +//add data source and start query in +await app.add("https://www.forbes.com/profile/elon-musk"); +await app.query('Tell me about Elon Musk'); +``` + + + diff --git a/docs/components/vector-databases/qdrant.mdx b/docs/components/vector-databases/qdrant.mdx new file mode 100644 index 00000000..9904c5f0 --- /dev/null +++ b/docs/components/vector-databases/qdrant.mdx @@ -0,0 +1,36 @@ +--- +title: Qdrant +--- + +[Qdrant](https://qdrant.tech/) is a Vector Search Engine written in Rust. You will need to sign up to get an API key and URL to use Qdrant. + +## Install Qdrant addon + +```bash +npm install @llm-tools/embedjs-pinecone +``` + +## Usage + +```ts Example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { QdrantDb } from '@llm-tools/embedjs-qdrant'; + +// set OPENAI_API_KEY in your env +process.env.OPENAI_API_KEY = "sk-xxx"; + +const app = await new RAGApplicationBuilder() +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setVectorDb(new QdrantDb({ apiKey: '...'; url: '...'; clusterName: '...' })) +.build(); + + +//add data source and start query in +await app.add("https://www.forbes.com/profile/elon-musk"); +await app.query('Tell me about Elon Musk'); +``` + + + diff --git a/docs/components/vector-databases/weaviate.mdx b/docs/components/vector-databases/weaviate.mdx new file mode 100644 index 00000000..370d49f1 --- /dev/null +++ b/docs/components/vector-databases/weaviate.mdx @@ -0,0 +1,36 @@ +--- +title: Weaviate +--- + +[Weaviate](https://weaviate.io/) is an open source vector store. You can deploy it locally on docker or use their managed cloud offering. + +## Install Qdrant addon + +```bash +npm install @llm-tools/embedjs-weaviate +``` + +## Usage + +```ts Example +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { WeaviateDb } from '@llm-tools/embedjs-weaviate'; + +// set OPENAI_API_KEY in your env +process.env.OPENAI_API_KEY = "sk-xxx"; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new WeaviateDb({ host: '...', apiKey: '...', className: '...', scheme: '...' })) +.build(); + + +//add data source and start query in +await app.add("https://www.forbes.com/profile/elon-musk"); +await app.query('Tell me about Elon Musk'); +``` + + + diff --git a/docs/contribution/dev.mdx b/docs/contribution/dev.mdx new file mode 100644 index 00000000..07a693ae --- /dev/null +++ b/docs/contribution/dev.mdx @@ -0,0 +1,39 @@ +--- +title: '👨‍💻 Development' +description: 'Contribute to EmbedJs framework development' +--- + +Thank you for your interest in contributing to the EmbedJs project! We welcome your ideas and contributions to help improve the project. Please follow the instructions below to get started: + +1. **Fork the repository**: Click on the "Fork" button at the top right corner of this repository page. This will create a copy of the repository in your own GitHub account. + +2. **Install the required dependencies**: Ensure that you have the necessary dependencies installed. You can do this by running the following command: + +```bash +npm install +``` + +3. **Make changes in the code**: Create a new branch in your forked repository and make your desired changes in the codebase. + +4. **Create a pull request**: When you are ready to contribute your changes, submit a pull request to the EmbedJs repository. Provide a clear and descriptive title for your pull request, along with a detailed description of the changes you have made. + +## Team + +### Maintainers + +- Adhityan K V ([@kvadhityan](https://twitter.com/kvadhityan)) + +### Citation + +If you utilize this repository, please consider citing it with: + +``` +@misc{embedJs, + author = {Adhityan K V}, + title = {EmbedJs: The Open Source RAG Framework}, + year = {2023}, + publisher = {GitHub}, + journal = {GitHub repository}, + howpublished = {\url{https://github.com/llm-tools/embedjs}}, +} +``` diff --git a/docs/contribution/docs.mdx b/docs/contribution/docs.mdx new file mode 100644 index 00000000..2b74a31a --- /dev/null +++ b/docs/contribution/docs.mdx @@ -0,0 +1,28 @@ +--- +title: '📝 Documentation' +description: 'Contribute to EmbedJs docs' +--- + +Thank you for your interest in contributing to the EmbedJs project documentation! Please follow the instructions below to get started: + +Step 1. Go to the `docs/` directory (where you can find `mint.json`) and run the following command: + +```bash +npx mintlify dev +``` + +The documentation website is now available at `http://localhost:3000`. + +### Custom Ports + +Mintlify uses port 3000 by default. You can use the `--port` flag to customize the port Mintlify runs on. For example, use this command to run in port 3333: + +```bash +mintlify dev --port 3333 +``` + +You will see an error like this if you try to run Mintlify in a port that's already taken: + +```md +Error: listen EADDRINUSE: address already in use :::3000 +``` diff --git a/docs/contribution/guidelines.mdx b/docs/contribution/guidelines.mdx new file mode 100644 index 00000000..68ab5efc --- /dev/null +++ b/docs/contribution/guidelines.mdx @@ -0,0 +1,4 @@ +--- +title: '📋 Guidelines' +url: https://github.com/llm-tools/embedJs/blob/main/CONTRIBUTING.md +--- diff --git a/docs/development.mdx b/docs/development.mdx deleted file mode 100644 index 87830089..00000000 --- a/docs/development.mdx +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: 'Development' -description: 'Learn how to preview changes locally' ---- - - - **Prerequisite** You should have installed Node.js (version 18.10.0 or - higher). - - -Step 1. Install Mintlify on your OS: - - - -```bash npm -npm i -g mintlify -``` - -```bash yarn -yarn global add mintlify -``` - - - -Step 2. Go to the docs are located (where you can find `mint.json`) and run the following command: - -```bash -mintlify dev -``` - -The documentation website is now available at `http://localhost:3000`. - -### Custom Ports - -Mintlify uses port 3000 by default. You can use the `--port` flag to customize the port Mintlify runs on. For example, use this command to run in port 3333: - -```bash -mintlify dev --port 3333 -``` - -You will see an error like this if you try to run Mintlify in a port that's already taken: - -```md -Error: listen EADDRINUSE: address already in use :::3000 -``` - -## Mintlify Versions - -Each CLI is linked to a specific version of Mintlify. Please update the CLI if your local website looks different than production. - - - -```bash npm -npm i -g mintlify@latest -``` - -```bash yarn -yarn global upgrade mintlify -``` - - - -## Deployment - - - Unlimited editors available under the [Startup - Plan](https://mintlify.com/pricing) - - -You should see the following if the deploy successfully went through: - - - - - -## Troubleshooting - -Here's how to solve some common problems when working with the CLI. - - - - Update to Node v18. Run `mintlify install` and try again. - - -Go to the `C:/Users/Username/.mintlify/` directory and remove the `mint` -folder. Then Open the Git Bash in this location and run `git clone -https://github.com/mintlify/mint.git`. - -Repeat step 3. - - - - Try navigating to the root of your device and delete the ~/.mintlify folder. - Then run `mintlify dev` again. - - - -Curious about what changed in a CLI version? [Check out the CLI changelog.](/changelog/command-line) diff --git a/docs/essentials/code.mdx b/docs/essentials/code.mdx deleted file mode 100644 index d2a462a7..00000000 --- a/docs/essentials/code.mdx +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: 'Code Blocks' -description: 'Display inline code and code blocks' -icon: 'code' ---- - -## Basic - -### Inline Code - -To denote a `word` or `phrase` as code, enclose it in backticks (`). - -``` -To denote a `word` or `phrase` as code, enclose it in backticks (`). -``` - -### Code Block - -Use [fenced code blocks](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) by enclosing code in three backticks and follow the leading ticks with the programming language of your snippet to get syntax highlighting. Optionally, you can also write the name of your code after the programming language. - -```java HelloWorld.java -class HelloWorld { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} -``` - -````md -```java HelloWorld.java -class HelloWorld { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} -``` -```` diff --git a/docs/essentials/images.mdx b/docs/essentials/images.mdx deleted file mode 100644 index 60ad42d3..00000000 --- a/docs/essentials/images.mdx +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: 'Images and Embeds' -description: 'Add image, video, and other HTML elements' -icon: 'image' ---- - - - -## Image - -### Using Markdown - -The [markdown syntax](https://www.markdownguide.org/basic-syntax/#images) lets you add images using the following code - -```md -![title](/path/image.jpg) -``` - -Note that the image file size must be less than 5MB. Otherwise, we recommend hosting on a service like [Cloudinary](https://cloudinary.com/) or [S3](https://aws.amazon.com/s3/). You can then use that URL and embed. - -### Using Embeds - -To get more customizability with images, you can also use [embeds](/writing-content/embed) to add images - -```html - -``` - -## Embeds and HTML elements - - - -
- - - -Mintlify supports [HTML tags in Markdown](https://www.markdownguide.org/basic-syntax/#html). This is helpful if you prefer HTML tags to Markdown syntax, and lets you create documentation with infinite flexibility. - - - -### iFrames - -Loads another HTML page within the document. Most commonly used for embedding videos. - -```html - -``` diff --git a/docs/essentials/markdown.mdx b/docs/essentials/markdown.mdx deleted file mode 100644 index c8ad9c1f..00000000 --- a/docs/essentials/markdown.mdx +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: 'Markdown Syntax' -description: 'Text, title, and styling in standard markdown' -icon: 'text-size' ---- - -## Titles - -Best used for section headers. - -```md -## Titles -``` - -### Subtitles - -Best use to subsection headers. - -```md -### Subtitles -``` - - - -Each **title** and **subtitle** creates an anchor and also shows up on the table of contents on the right. - - - -## Text Formatting - -We support most markdown formatting. Simply add `**`, `_`, or `~` around text to format it. - -| Style | How to write it | Result | -| ------------- | ----------------- | --------------- | -| Bold | `**bold**` | **bold** | -| Italic | `_italic_` | _italic_ | -| Strikethrough | `~strikethrough~` | ~strikethrough~ | - -You can combine these. For example, write `**_bold and italic_**` to get **_bold and italic_** text. - -You need to use HTML to write superscript and subscript text. That is, add `` or `` around your text. - -| Text Size | How to write it | Result | -| ----------- | ------------------------ | ---------------------- | -| Superscript | `superscript` | superscript | -| Subscript | `subscript` | subscript | - -## Linking to Pages - -You can add a link by wrapping text in `[]()`. You would write `[link to google](https://google.com)` to [link to google](https://google.com). - -Links to pages in your docs need to be root-relative. Basically, you should include the entire folder path. For example, `[link to text](/writing-content/text)` links to the page "Text" in our components section. - -Relative links like `[link to text](../text)` will open slower because we cannot optimize them as easily. - -## Blockquotes - -### Singleline - -To create a blockquote, add a `>` in front of a paragraph. - -> Dorothy followed her through many of the beautiful rooms in her castle. - -```md -> Dorothy followed her through many of the beautiful rooms in her castle. -``` - -### Multiline - -> Dorothy followed her through many of the beautiful rooms in her castle. -> -> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. - -```md -> Dorothy followed her through many of the beautiful rooms in her castle. -> -> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. -``` - -### LaTeX - -Mintlify supports [LaTeX](https://www.latex-project.org) through the Latex component. - -8 x (vk x H1 - H2) = (0,1) - -```md -8 x (vk x H1 - H2) = (0,1) -``` diff --git a/docs/essentials/navigation.mdx b/docs/essentials/navigation.mdx deleted file mode 100644 index ca44bb64..00000000 --- a/docs/essentials/navigation.mdx +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: 'Navigation' -description: 'The navigation field in mint.json defines the pages that go in the navigation menu' -icon: 'map' ---- - -The navigation menu is the list of links on every website. - -You will likely update `mint.json` every time you add a new page. Pages do not show up automatically. - -## Navigation syntax - -Our navigation syntax is recursive which means you can make nested navigation groups. You don't need to include `.mdx` in page names. - - - -```json Regular Navigation -"navigation": [ - { - "group": "Getting Started", - "pages": ["quickstart"] - } -] -``` - -```json Nested Navigation -"navigation": [ - { - "group": "Getting Started", - "pages": [ - "quickstart", - { - "group": "Nested Reference Pages", - "pages": ["nested-reference-page"] - } - ] - } -] -``` - - - -## Folders - -Simply put your MDX files in folders and update the paths in `mint.json`. - -For example, to have a page at `https://yoursite.com/your-folder/your-page` you would make a folder called `your-folder` containing an MDX file called `your-page.mdx`. - - - -You cannot use `api` for the name of a folder unless you nest it inside another folder. Mintlify uses Next.js which reserves the top-level `api` folder for internal server calls. A folder name such as `api-reference` would be accepted. - - - -```json Navigation With Folder -"navigation": [ - { - "group": "Group Name", - "pages": ["your-folder/your-page"] - } -] -``` - -## Hidden Pages - -MDX files not included in `mint.json` will not show up in the sidebar but are accessible through the search bar and by linking directly to them. diff --git a/docs/essentials/reusable-snippets.mdx b/docs/essentials/reusable-snippets.mdx deleted file mode 100644 index a0a55297..00000000 --- a/docs/essentials/reusable-snippets.mdx +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: Reusable Snippets -description: Reusable, custom snippets to keep content in sync -icon: 'recycle' ---- - -import SnippetIntro from '/snippets/snippet-intro.mdx'; - - - -## Creating a custom snippet - -**Pre-condition**: You must create your snippet file in the `snippets` directory. - - - Any page in the `snippets` directory will be treated as a snippet and will not - be rendered into a standalone page. If you want to create a standalone page - from the snippet, import the snippet into another file and call it as a - component. - - -### Default export - -1. Add content to your snippet file that you want to re-use across multiple - locations. Optionally, you can add variables that can be filled in via props - when you import the snippet. - -```mdx snippets/my-snippet.mdx -Hello world! This is my content I want to reuse across pages. My keyword of the -day is {word}. -``` - - - The content that you want to reuse must be inside the `snippets` directory in - order for the import to work. - - -2. Import the snippet into your destination file. - -```mdx destination-file.mdx ---- -title: My title -description: My Description ---- - -import MySnippet from '/snippets/path/to/my-snippet.mdx'; - -## Header - -Lorem impsum dolor sit amet. - - -``` - -### Reusable variables - -1. Export a variable from your snippet file: - -```mdx snippets/path/to/custom-variables.mdx -export const myName = 'my name'; - -export const myObject = { fruit: 'strawberries' }; -``` - -2. Import the snippet from your destination file and use the variable: - -```mdx destination-file.mdx ---- -title: My title -description: My Description ---- - -import { myName, myObject } from '/snippets/path/to/custom-variables.mdx'; - -Hello, my name is {myName} and I like {myObject.fruit}. -``` - -### Reusable components - -1. Inside your snippet file, create a component that takes in props by exporting - your component in the form of an arrow function. - -```mdx snippets/custom-component.mdx -export const MyComponent = ({ title }) => ( -
-

{title}

-

... snippet content ...

-
-); -``` - - - MDX does not compile inside the body of an arrow function. Stick to HTML - syntax when you can or use a default export if you need to use MDX. - - -2. Import the snippet into your destination file and pass in the props - -```mdx destination-file.mdx ---- -title: My title -description: My Description ---- - -import { MyComponent } from '/snippets/custom-component.mdx'; - -Lorem ipsum dolor sit amet. - - -``` diff --git a/docs/essentials/settings.mdx b/docs/essentials/settings.mdx deleted file mode 100644 index d9dd2d7e..00000000 --- a/docs/essentials/settings.mdx +++ /dev/null @@ -1,318 +0,0 @@ ---- -title: 'Global Settings' -description: 'Mintlify gives you complete control over the look and feel of your documentation using the mint.json file' -icon: 'gear' ---- - -Every Mintlify site needs a `mint.json` file with the core configuration settings. Learn more about the [properties](#properties) below. - -## Properties - - -Name of your project. Used for the global title. - -Example: `mintlify` - - - - - An array of groups with all the pages within that group - - - The name of the group. - - Example: `Settings` - - - - The relative paths to the markdown files that will serve as pages. - - Example: `["customization", "page"]` - - - - - - - - Path to logo image or object with path to "light" and "dark" mode logo images - - - Path to the logo in light mode - - - Path to the logo in dark mode - - - Where clicking on the logo links you to - - - - - - Path to the favicon image - - - - Hex color codes for your global theme - - - The primary color. Used for most often for highlighted content, section - headers, accents, in light mode - - - The primary color for dark mode. Used for most often for highlighted - content, section headers, accents, in dark mode - - - The primary color for important buttons - - - The color of the background in both light and dark mode - - - The hex color code of the background in light mode - - - The hex color code of the background in dark mode - - - - - - - - Array of `name`s and `url`s of links you want to include in the topbar - - - The name of the button. - - Example: `Contact us` - - - The url once you click on the button. Example: `https://mintlify.com/contact` - - - - - - - - - Link shows a button. GitHub shows the repo information at the url provided including the number of GitHub stars. - - - If `link`: What the button links to. - - If `github`: Link to the repository to load GitHub information from. - - - Text inside the button. Only required if `type` is a `link`. - - - - - - - Array of version names. Only use this if you want to show different versions - of docs with a dropdown in the navigation bar. - - - - An array of the anchors, includes the `icon`, `color`, and `url`. - - - The [Font Awesome](https://fontawesome.com/search?s=brands%2Cduotone) icon used to feature the anchor. - - Example: `comments` - - - The name of the anchor label. - - Example: `Community` - - - The start of the URL that marks what pages go in the anchor. Generally, this is the name of the folder you put your pages in. - - - The hex color of the anchor icon background. Can also be a gradient if you pass an object with the properties `from` and `to` that are each a hex color. - - - Used if you want to hide an anchor until the correct docs version is selected. - - - Pass `true` if you want to hide the anchor until you directly link someone to docs inside it. - - - One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin" - - - - - - - Override the default configurations for the top-most anchor. - - - The name of the top-most anchor - - - Font Awesome icon. - - - One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin" - - - - - - An array of navigational tabs. - - - The name of the tab label. - - - The start of the URL that marks what pages go in the tab. Generally, this - is the name of the folder you put your pages in. - - - - - - Configuration for API settings. Learn more about API pages at [API Components](/api-playground/demo). - - - The base url for all API endpoints. If `baseUrl` is an array, it will enable for multiple base url - options that the user can toggle. - - - - - - The authentication strategy used for all API endpoints. - - - The name of the authentication parameter used in the API playground. - - If method is `basic`, the format should be `[usernameName]:[passwordName]` - - - The default value that's designed to be a prefix for the authentication input field. - - E.g. If an `inputPrefix` of `AuthKey` would inherit the default input result of the authentication field as `AuthKey`. - - - - - - Configurations for the API playground - - - - Whether the playground is showing, hidden, or only displaying the endpoint with no added user interactivity `simple` - - Learn more at the [playground guides](/api-playground/demo) - - - - - - Enabling this flag ensures that key ordering in OpenAPI pages matches the key ordering defined in the OpenAPI file. - - This behavior will soon be enabled by default, at which point this field will be deprecated. - - - - - - - A string or an array of strings of URL(s) or relative path(s) pointing to your - OpenAPI file. - - Examples: - - ```json Absolute - "openapi": "https://example.com/openapi.json" - ``` - ```json Relative - "openapi": "/openapi.json" - ``` - ```json Multiple - "openapi": ["https://example.com/openapi1.json", "/openapi2.json", "/openapi3.json"] - ``` - - - - - - An object of social media accounts where the key:property pair represents the social media platform and the account url. - - Example: - ```json - { - "x": "https://x.com/mintlify", - "website": "https://mintlify.com" - } - ``` - - - One of the following values `website`, `facebook`, `x`, `discord`, `slack`, `github`, `linkedin`, `instagram`, `hacker-news` - - Example: `x` - - - The URL to the social platform. - - Example: `https://x.com/mintlify` - - - - - - Configurations to enable feedback buttons - - - - Enables a button to allow users to suggest edits via pull requests - - - Enables a button to allow users to raise an issue about the documentation - - - - - - Customize the dark mode toggle. - - - Set if you always want to show light or dark mode for new users. When not - set, we default to the same mode as the user's operating system. - - - Set to true to hide the dark/light mode toggle. You can combine `isHidden` with `default` to force your docs to only use light or dark mode. For example: - - - ```json Only Dark Mode - "modeToggle": { - "default": "dark", - "isHidden": true - } - ``` - - ```json Only Light Mode - "modeToggle": { - "default": "light", - "isHidden": true - } - ``` - - - - - - - - - A background image to be displayed behind every page. See example with - [Infisical](https://infisical.com/docs) and [FRPC](https://frpc.io). - diff --git a/docs/examples/slack_bot.mdx b/docs/examples/slack_bot.mdx new file mode 100644 index 00000000..78bed2e2 --- /dev/null +++ b/docs/examples/slack_bot.mdx @@ -0,0 +1,36 @@ +--- +title: '💼 Slack Bot' +--- + +### 🖼️ Setup + +1. Create a workspace on Slack if you don't have one already by clicking [here](https://slack.com/intl/en-in/). +2. Create a new App on your Slack account by going [here](https://api.slack.com/apps). +3. Select `From Scratch`, then enter the Bot Name and select your workspace. +4. On the left Sidebar, go to `OAuth and Permissions` and add the following scopes under `Bot Token Scopes`: +```text +app_mentions:read +channels:read +chat:write +``` +5. Now select the option `Install to Workspace` and after it's done, copy the `Bot User OAuth Token` and set it in your secrets as `SLACK_BOT_TOKEN`. +6. Clone the example slack repo from [here](https://github.com/llm-tools/slack-bot-template). +7. Run NPM install and start the server. The application starts and prints by default a `NGROK reverse proxy URL` to the console. +8. On the Slack API website go to `Event Subscriptions` on the left Sidebar and turn on `Enable Events`. +9. In `Request URL`, enter your server or ngrok address. +10. After it gets verified, click on `Subscribe to bot events`, add `message.channels` Bot User Event and click on `Save Changes`. +11. Now go to your workspace, right click on the bot name in the sidebar, click `view app details`, then `add this app to a channel`. + +### 🚀 Usage Instructions + +- Go to the channel where you have added your bot. +- To add data sources to the bot, use the command: +```text +/learnfrom web +``` +- To ask queries from the bot, just tag the bot and ask your question. +```text +@botname +``` + +🎉 Happy Chatting! 🎉 diff --git a/docs/favicon.png b/docs/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9e25a3d635ceb7801f901f9bc159c9e3c16dbb07 GIT binary patch literal 80549 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 literal 0 HcmV?d00001 diff --git a/docs/favicon.svg b/docs/favicon.svg deleted file mode 100644 index 6a323326..00000000 --- a/docs/favicon.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/get-started/faq.mdx b/docs/get-started/faq.mdx new file mode 100644 index 00000000..88cdce9c --- /dev/null +++ b/docs/get-started/faq.mdx @@ -0,0 +1,76 @@ +--- +title: ❓ FAQs +description: 'Collections of all the frequently asked questions' +--- + + +Use the model `gpt-4o` provided my openai. + + +```ts index.ts +import 'dotenv/config'; +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { Mistral } from '@llm-tools/embedjs-mistral'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const llmApplication = await new RAGApplicationBuilder() + .setModel(new Mistral({ modelName: 'mistral-medium' })) + .setVectorDb(new HNSWDb()) + .build(); + +await llmApplication.addLoader(new WebLoader({ urlOrContent: 'https://en.wikipedia.org/wiki/Tesla,_Inc.' })); + +console.log(await llmApplication.query('Who founded Tesla?')); +``` + + + + + +```ts index.ts +import 'dotenv/config'; +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi, OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const llmApplication = await new RAGApplicationBuilder() + .setModel(new OpenAi({ modelName: 'gpt-4o' })) + .setEmbeddingModel(new OpenAi3SmallEmbeddings()) + .setVectorDb(new HNSWDb()) + .build(); + +await llmApplication.addLoader(new WebLoader({ urlOrContent: 'https://en.wikipedia.org/wiki/Tesla,_Inc.' })); + +console.log(await llmApplication.query('Who founded Tesla?')); +``` + + + + + +```ts index.ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OllamaEmbeddings } from '@llm-tools/embedjs-ollama'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; + +const ragApplication = await new RAGApplicationBuilder() +.setModel(new Ollama({ modelName: "llama3.2", baseUrl: 'http://localhost:11434' })) +.setEmbeddingModel(new OllamaEmbeddings({ model: 'nomic-embed-text', baseUrl: 'http://localhost:11434' })) +.build(); + +ragApplication.addLoader({ urlOrContent: 'https://www.forbes.com/profile/elon-musk' }) +ragApplication.addLoader({ urlOrContent: 'https://en.wikipedia.org/wiki/Elon_Musk' }) + +await ragApplication.query('What is the net worth of Elon Musk today?') +``` + + + + + +#### Still have questions? +If docs aren't sufficient, please feel free to reach out to us using one of the following methods: + + diff --git a/docs/get-started/introduction.mdx b/docs/get-started/introduction.mdx new file mode 100644 index 00000000..b8a4c79a --- /dev/null +++ b/docs/get-started/introduction.mdx @@ -0,0 +1,62 @@ +--- +title: 📚 Introduction +--- + +## What is EmbedJs? + +EmbedJs is an Open Source Framework that makes it easy to create and deploy personalized AI apps. At its core, EmbedJs follows the design principle of being _"Conventional but Configurable"_ to serve both software engineers and machine learning engineers. + +EmbedJs streamlines the creation of personalized LLM applications, offering a seamless process for managing various types of unstructured data. It efficiently segments data into manageable chunks, generates relevant embeddings, and stores them in a vector database for optimized retrieval. With a suite of diverse APIs, it enables users to extract contextual information, find precise answers, or engage in interactive chat conversations, all tailored to their own data. + +## Who is EmbedJs for? + +EmbedJs is designed for a diverse range of users, from AI professionals like Data Scientists and Machine Learning Engineers to those just starting their AI journey, including college students, independent developers, and hobbyists. Essentially, it's for anyone with an interest in AI, regardless of their expertise level. + +Our APIs are user-friendly yet adaptable, enabling beginners to effortlessly create LLM-powered applications with as few as 7 lines of code. At the same time, we offer extensive customization options for every aspect of building a personalized AI application. This includes the choice of LLMs, vector databases, loaders and chunkers, and more. + +Our platform's clear and well-structured abstraction layers ensure that users can tailor the system to meet their specific needs, whether they're crafting a simple project or a complex, nuanced AI application. + +## Why Use EmbedJs? + +Developing a personalized AI application for production use presents numerous complexities, such as: + +- Integrating and indexing data from diverse sources. +- Determining optimal data chunking methods for each source. +- Synchronizing the RAG pipeline with regularly updated data sources. +- Implementing efficient data storage in a vector store. +- Deciding whether to include metadata with document chunks. +- Configuring Large Language Models (LLMs). +- Selecting effective prompts. + +EmbedJs is designed to simplify these tasks, offering conventional yet customizable APIs. Our solution handles the intricate processes of loading, chunking, indexing, and retrieving data. This enables you to concentrate on aspects that are crucial for your specific use case or business objectives, ensuring a smoother and more focused development process. + +## How it works? + +EmbedJs makes it easy to add data to your RAG pipeline with these straightforward steps: + +1. **Automatic Data Handling**: It automatically recognizes the data type and loads it. +2. **Efficient Data Processing**: The system creates embeddings for key parts of your data. +3. **Flexible Data Storage**: You get to choose where to store this processed data in a vector database. + +When a user asks a question, whether for chatting, searching, or querying, EmbedJs simplifies the response process: + +1. **Query Processing**: It turns the user's question into embeddings. +2. **Document Retrieval**: These embeddings are then used to find related documents in the database. +3. **Answer Generation**: The related documents are used by the LLM to craft a precise answer. + +With EmbedJs, you don’t have to worry about the complexities of building a personalized AI application. It offers an easy-to-use interface for developing applications with any kind of data. + +## Getting started + +Checkout our [quickstart guide](/get-started/quickstart) to start your first AI application. + +## Support + +Feel free to reach out to us if you have ideas, feedback or questions that we can help out with. + + + +## Contribute + +- [GitHub](https://github.com/llm-tools/embedjs) +- [Contribution docs](/contribution/dev) diff --git a/docs/get-started/quickstart.mdx b/docs/get-started/quickstart.mdx new file mode 100644 index 00000000..868fa0f3 --- /dev/null +++ b/docs/get-started/quickstart.mdx @@ -0,0 +1,91 @@ +--- +title: '⚡ Quickstart' +description: '💡 Create an AI app on your own data in a minute' +--- + +## Installation + +First install the NodeJs package: + +```bash +npm i @llm-tools/embedjs +``` + +Once you have installed the package, depending upon your preference you can either use: + + + + This includes Open source LLMs like Mistral, Llama, etc. +
+ Free to use, and runs locally on your machine. +
+ + This includes paid LLMs like GPT 4, Claude, etc. +
+ Cost money and are accessible via an API. +
+
+ +## Open Source Models + +This section provides a quickstart example of using `Llama3.2` as the Open source LLM and `nomic-embed-text` as the Open source embedding model. + +These models are free and can be run locally using Ollama. Read the documentation [here](todo) for more information on getting started with Ollama. + + +```ts ollama_demo.ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OllamaEmbeddings } from '@llm-tools/embedjs-ollama'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const ragApplication = await new RAGApplicationBuilder() +.setModel(new Ollama({ modelName: "llama3.2", baseUrl: 'http://localhost:11434' })) +.setEmbeddingModel(new OllamaEmbeddings({ model: 'nomic-embed-text', baseUrl: 'http://localhost:11434' })) +.setVectorDb(new HNSWDb()) +.build(); + +ragApplication.addLoader({ urlOrContent: 'https://www.forbes.com/profile/elon-musk' }) +ragApplication.addLoader({ urlOrContent: 'https://en.wikipedia.org/wiki/Elon_Musk' }) + +await ragApplication.query('What is the net worth of Elon Musk today?') +//Answer: The net worth of Elon Musk today is $258.7 billion. +``` + + +## Paid Models + +In this section, we will use both an LLM and embedding model from OpenAI. + + +```ts openai_demo.ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { WebLoader } from '@llm-tools/embedjs-loader-web'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +//Replace this with your OpenAI key +process.env.OPENAI_API_KEY = "sk-xxxx" + +const ragApplication = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); + +ragApplication.addLoader({ urlOrContent: 'https://www.forbes.com/profile/elon-musk' }) +ragApplication.addLoader({ urlOrContent: 'https://en.wikipedia.org/wiki/Elon_Musk' }) + +await ragApplication.query('What is the net worth of Elon Musk today?') +//Answer: The net worth of Elon Musk today is $258.7 billion. +``` + + +# Next Steps + +Now that you have created your first app, you can follow any of the links: + +- [Introduction](/get-started/introduction) +- [Customization](/components/introduction) +- [Use cases](/use-cases/introduction) +- [Deployment](/get-started/deployment) diff --git a/docs/images/hero-dark.svg b/docs/images/hero-dark.svg deleted file mode 100644 index c6a30e88..00000000 --- a/docs/images/hero-dark.svg +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/hero-light.svg b/docs/images/hero-light.svg deleted file mode 100644 index 297d68fb..00000000 --- a/docs/images/hero-light.svg +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/langsmith.png b/docs/images/langsmith.png new file mode 100644 index 0000000000000000000000000000000000000000..5d5ff542293ff04c6c9cb8d552060ad7e18d3a77 GIT binary patch literal 430753 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�{BM1bnpeeu)h6iGgH0{BmU;WUVXxjG`HIOC4QWF={ zGHQA$w)q1y)PEOPXP(at4;dMmzOUT}cj%TLDuWibP{NHsM3PDmw}oQK8G zViad0&qPG@*i3Apu`CKlqv=HT}aEG`2C(e7OBczQ_HvAgM{!W_xL z)fTikJ~??EFy1E&woL%P5rQ|8fWj;G-yU@4&l0V=#$0R?Mt%SNpZ^O05@3odW<1yJ z!+?y|tjp=JM>28B|3Ou;62}N9_DEf4rIm5~ti-E(>bZ|#2A}itdiq0aL#n)HWj71j ztFav4-J_!Br6znAU%~&D*)`)fiQEQNvUNq>t36DqcCwwVK1#(Oi9}j%PUWU!hOcq@ zMz@A&r^=mU=6Sj2DODBTe413vdhv(EjF78xkf`^m(~x|BhM}#{PklK&e>h8 z1#gDF>8NR_^1IBA_|`-WQ~I26N(h>@>=M4}Vb7P>jKQjEbOe6G~}Ydi{34mO<)pW zqC3G;u-ogN&N7tTU$_8DHJ&dPzT_9y8;DQOhKozP){YNB)V;5*Oi&h9M4!+-cHS6r zN(!}elSYHJKTP*O5V_qynKBnI&w5k1qEY+e|*-M9f8Duk>73523IJZ2@pLHPCCxezD`6efvR$P13K0zm-2g zmoGRg@aJUJ-x32!B)ui*X<^-3i3$TyEX$eD{kgHa|01+`_8k*)xl_)vXkV3sb1pAy zHjt}c_gYza)Aq^-(I^W-9}bjHFOhPXY`c0ZP_Nv>w{;$kN;!fx)oD=d;h9!)2)@BEfFH9$)Jhrx-0Ap9AvUK(uD0wVNN|A6FcXDz%b}s6Tnm(}@OyhSN z652q25bUZ4N*i**qGSCr)yqpcn*0~l!v$w`5Eh(lsKXz;|Gg32{d;i$SMD* z8j|-YFT@5Y)_*3_t!OM2SE>(}`bMN+rmCIiGQl~L!GAl0<}RBWkQ`bu896!m`n?5KR(_qsnyuZmNzZ$Csf%;Im0;oUh{KXB$ZM{M!Xv^d2&b(l z4;-s(HxFr&Mrano*$i_4O69o-DlzdVci*rM^Y&4)pcfxh%h#~U5?
9ff$`Zh7s$ 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%0DKeSBb2i#`$bnvU4$NfL?&A`?GeFD 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%0ABdc&| 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%0AlYdP`)GkU!u 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

v6DzLVqLMJV>GVdf8{q`!gM}`c45C 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 literal 0 HcmV?d00001 diff --git a/docs/integration/langsmith.mdx b/docs/integration/langsmith.mdx new file mode 100644 index 00000000..8be12bd0 --- /dev/null +++ b/docs/integration/langsmith.mdx @@ -0,0 +1,60 @@ +--- +title: '🛠️ LangSmith' +description: 'Integrate with Langsmith to debug and monitor your LLM app' +--- + +EmbedJs now supports integration with [LangSmith](https://www.langchain.com/langsmith). + +To use LangSmith, you need to do the following steps. + +1. Have an account on LangSmith and keep the environment variables in handy +2. Set the environment variables in your app so that EmbedJs has context about it. +3. Just use EmbedJs and everything will be logged to LangSmith, so that you can better test and monitor your application. + +Let's cover each step in detail. + +* First make sure that you have created a LangSmith account and have all the necessary variables handy. LangSmith has a [good documentation](https://docs.smith.langchain.com/) on how to get started with their service. + +* Once you have setup the account, we will need the following environment variables + +```bash +# Setting environment variable for LangChain Tracing V2 integration. +export LANGCHAIN_TRACING_V2=true + +# Setting the API endpoint for LangChain. +export LANGCHAIN_ENDPOINT=https://api.smith.langchain.com + +# Replace '' with your LangChain API key. +export LANGCHAIN_API_KEY= + +# Replace '' with your LangChain project name, or it defaults to "default". +export LANGCHAIN_PROJECT= # if not specified, defaults to "default" +``` + +* Now create an app using EmbedJs and everything will be automatically visible in LangSmith automatically. + + +```ts +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; + +//Replace this with your OpenAI key +process.env.OPENAI_API_KEY = "sk-xxxx" + +//Build a new application +const ragApplication = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.build(); + +//Add new documents +ragApplication.addLoader('https://www.forbes.com/profile/elon-musk') +ragApplication.addLoader('https://en.wikipedia.org/wiki/Elon_Musk') + +//Query your app +await ragApplication.query('What is the net worth of Elon Musk today?') +``` + +* Now the entire log for this will be visible in langsmith. + + diff --git a/docs/introduction.mdx b/docs/introduction.mdx deleted file mode 100644 index 2589c0b9..00000000 --- a/docs/introduction.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Introduction -description: 'Welcome to the home of your new documentation' ---- - -Hero Light -Hero Dark - -## Setting up - -The first step to world-class documentation is setting up your editing environments. - - - - Get your docs set up locally for easy development - - - Preview your changes before you push to make sure they're perfect - - - -## Make it yours - -Update your docs to your brand and add valuable content for the best user conversion. - - - - Customize your docs to your company's colors and brands - - - Automatically generate endpoints from an OpenAPI spec - - - Build interactive features and designs to guide your users - - - Check out our showcase of our favorite documentation - - diff --git a/docs/logo/dark.svg b/docs/logo/dark.svg deleted file mode 100644 index a6283786..00000000 --- a/docs/logo/dark.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/logo/dark.webp b/docs/logo/dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..51e4c9935ffe8cfe47080b33befd5abff842452c GIT binary patch literal 24586 zcmXVXcQo7I|9@<)mJXwc(N+*tYj0XD8lxm;>=M+TslBRb?MCcXTa4IyMZImMwW~x_ zNyXku@y+M_et+bgyw16~_jT_x&-HjbE)1fsPH7DQ7^|u38R^NITn7LEx5ytEYQQTB zz%y;Vmw)vD0E#OCzL&dKe$Fq7wwG`Il%7t_bX6#K8a<|M^Yry?CZrNrZEn4LpJeUH zr^?&%+{5=BO)Q1jyY~cEN@}Kg$qBrY#x(LW-TUi(Z!AqK@#0~@)m@z4VqkjUMK#cW z0-_P*-`Uy|cxm;5_&UN$>GrgA=)Z-Vxb`c$o}QRy8PKX&f4Y_vzV=Sb)d{Zmq(sYK zvavB;OCkhtc_p`d8e9B^G*{qbNVVik3|hzDh;Dxd#(2cE{a8NV1U4RLm%I`BUNE-V zZaY?-W?nu8O5-+u=O8m=P@Zv&JDH{lsVIW!M6blk_Frf~KmwhL+_M@)IHB7PbkSnc zugh#0Ff~4O_D8%+u)Z$DWKiPrhf{7A!;%V{tc6a>QG{wZ7qj8(sf71kasw_`1|nPM zk-$=L_1X>drECY5jFjU=RmpAR@(1hramsBG%!c!?)quAAgXK?xWjSUa6Hg0a{?W`? z!sWk$@Z=d5?%J(#8MrKyQvYNz1i@DYf=lNXrXPKiN%PF#zs@Kkz4jc=Qli^`I3m}t zTyE0S9CI_!1d}s% z<(zeY^n|BxzrfN0u*5@5cc>H6o-e({E@12}#D1}tyNE~$DonS%^tH3gz+2JJ3b3`P zVo=p=z20FqaOhIcB+t&h%j%e8p`IQor_{-*Bf{Bl%B)vuhWm|ocH>%%{n=YDr8#u- zg8FX{8x9$d;3Up>icR=3FJ&2Z^Ew{3SCm(y-w9;jFP?+MO~|q5hWL-$G-5Zy7z1QUkA>wTynx89Tq#u`%v>tF6C&sB-u%2B3J}pg^tbdlpsb z%4&WU?{F%(i&fzG2ZOR~nSYm==UU(zqZ;kr93FX`O@Tl8;n(szW3eaN%_AWYZQN+P zGyJ)BvHEiV-%p;7^E^82ocG&7bCvjLExyHbxk2*_$`M_?a;NBAmh`P8HXW`m-!Bgc zXAYF+ZRY(|s7VXI%u3wxn#?a6WY zy*hb6qs-3+i)%`P9>oR22?0K`*lG|?O|#_AqcnbQImV6(7uj=gdE3_jUF*i7x(ShW zXT*gFx2U0biZdi2L?w|SrA6f7f^n=)``1YI*c4c%nJPYqgEG0|Fxk{JDoxLCHx%A^tAO8;Xme$cc{FV<@`G|wsTaHJ~* zkS3T>K3<#{sw_Y~8-BpZioY61O=*`8&|18$5MgmQdW-BP&x6)RHVAeGSyR=$6{Rw2 z-<2AIiBC&7cDi|up68>kn^kUNm06g`b2*W%HkWWK+k33{gX@lqroTaO^2`?hxcFVW zzNyl?ggYSp;6jM6>x-Yu=gPcb{%JYKt!-0MuXL(>LcLIX)8oG0NX-({(xNq_Fty5d zm_u>8!9kH!yK{zgiKzhBY~me)4M=~{+p(X=JxIUKyiwP*us!wSWl51kqHK9@-oHN$ z>~&6Wcb@P4&!(5Dd|;5iOeNl8r15uK>bon0N>vHA9hE(gd=y6bk-EMyf7Se5H+z$Z zoHb(a?oLV08J7y8#H|%U3q3%tpKU$W^#puAFpp94$}f!Ozb&)jJB~X zn)f|AZ5*MxasM5qQMc#~NuE~DSqL|^=ZD#@L+a|Z+wc4lJ|eH=c*``u-N?yTsp}yn zosg+qt7!jsW74t>XwtgDJS`ZO5OKg#6=%*A*K?9W-STuuQt;8FMMXn<6FsAEqzJ1f zH1W~P&v{e5Ao0mkI>l_E)fu?xqOw4E$i)AwM~f+Lcb=ZutvT01!L)~9G2e?4L+Hap zVE;1*t;0ssG=F1j33ax^7*99$m5Q>rPB`gJ0js87k9WtlQN>5 zoVDG&LE)(2wKrKb8j;F?AL(-ToD?nJcy5!eJxOp$g*EiGJAWO<{k`?h*I=DXr2d56 z_hKbuV7v2o&CT#{bj!>C8<%B+cgZw0-oiG{TR_!rQn`4Iv~&28B9?$rz88#)zO^XF zCsJBqP-EWNCFkRgQyO!bDy8DDtBcGg|7an#?E0Ew?wSFl1Hw5_Q9w}UW-fSqTKek5 zqFdf;DMz_^A9XM;9Vg^m^J-RZd~9dPW&+2W>~rVzG71-7_pH|jjqbjhVxe=Z*=>mn zn6X}bn}$pzn!&IIkT!7diInVV`-HW%7-ZsS_r+>L>^Hn!ya@G9PQ@D@sX{~X#;?T| zcjwGv$nhrRCN_^^oV5<`paa?K({Hl;LNOM&lUt3*8RvlSVhd-E68x5LnL{`m+FP^~qlJxsv~D{S&e-X* ztLN%P()h2A8R{uAY^{mGYmRyG+$ysj2aj8J{~df)BF??OkxsL-08sXR^3w&q@x#M3 zD|WE0M{N5M+%aZ8<=ZU5d=mu)nF>dTXh zkM5n969-Hemr)D}7ssNUBCpPG0jor*hmV7>72=Gkm>7k1@56sD{2yyV&&Hn}gr6iF zcTo@q+%GSLxr6*|uyq36d;e7pY+%Ju@i0B`JBs|SP6P`6s9S*<}YDrLkCs z|C1`#JTwflqGG2LguB<82Y7bhCMdZ+rbkJ~4@>XDS1*Jb<2{s-{r6B)38d+MVJ$uQW+N!sSl~YnZ)uV=(9Q-!llpzGO_x;i*6j2j97Gl@@(H^ zccl^u=of&wk>Xp6R9vWgkWGD~(nKFM>uFttVS30nx^SY&szq9nN_7}R18w?A%Qcub zDI-;@EjXASTgdJ@wtaozPpF{L{i?`~==2lAKGBh4TPpUdvE<;5o8ZiVa?s=`1M9nQ zJw%5lxeDPy*}^-M2M^Eg56T)~+Pym4xu^kb)+3=W{b4&_i%*zbZ<%wB&r2}357duo z!~I(mzD&}s-@7b=vB4*LwQd8$d`FS_XjDL*+WO@YuXE2{A5)49(%zTQs#Dugbi%rm zh^r5j0j+0#qBf=4+^=Jvu74z?;?LYeA!`((If+!Ct(4a?GMf5?IMlj)=HL8c{T@9) z^vQr7O!8=7P^tE|Us#-HvsNkcT5g_TvzOPR3UF57_8i|(+e4vkI&NI=+G9b`kzcIS zB|YWSumdD*Z(DDVJ30-uabdT2s1<XOVO`QSTNiLD4Kh5#Bbvy z&U7^~NvoM1x7mZ4M|2Ej)Pq~@_fQ~4gJaQ>f~Hf>oGV;}z1UxE?{Ocpic65GS(fm$ zr#!_(=Dstv&Tdxru!G7AcXDdUaGnV#P|zh{k9JoeFiB2cwe|kL*A9(EPE%ov1$fJh z8#slxc_ro%Z_r~th_C~n+Gv)?IVA~Kbqv&J!V)1S?Pb?0P!xWrSZ1lR%=I-f>NaJZ zmrBc3uQ`9cUmtDnZi2Gbz#n3Y6U)(_JOV)RDh)*ok3AcBhp^Dt#qG9B2}`*Sm$$@S zj^K=0HqeqtTk$Y}@gRzJ$^5a%vl*o9j)a>L%8?|GID9St&x&~?xhUrvAl##n9Ox4Q zTxnEiDZH-j^2iRL?%nlo1sMAp7GzMMGkuz{tLqGt-E z9G1beaHA~I3Jol04+S^Yc#1c7V;VGg7UE%EY!F*kYX1-HX_{lKaeRe|DXMcjalu5uhFm!)EoIL^)n?dL+Vb7L4^P z@Y)7~F(Z%G{5Ab0O15i@B+h~rIV%#NiShkZ;VH^SFk>^=02ujk)Q1;trAv^Bna;4U z)Bz~gD`Cs9W1!A}zxfL8jeW=GIhQX{UK@;{uk-1Zi2^k}+HfRPg%2Q$H8PMfn`p>t zx;GT|V_%?Kw0K)@YJ`Ds?h8y4G+u>GQ(xZ>Tk#`)dMO z+Et;t315y@5x}yda-I2)H|SmRvC@uo91Q^)fja<7@6OLtEHUyQ^{9;9q`$RY+)MCi z-XBJ}4N&Dm6NTUEPe2fWu^!s!oS=EALR=&usn$_+m<9R>^tmdEN`aYs-AH&1sZA;VU3UXm2N9@u@X9`-zX*%X)(J>zm(^SU=W z{+^W6l!@EUibpoKtlT>%icYa&GzqCc)kTdnu7VQp;^ahU4(**S z6S@q{%^+XU!K%OqsxbngejBus6d7tcQUG5`osp%HuK3hD3{iAi`vb?I1yBEr+C)` z`;E$(3<*<}OY2{BcLh53&Nkftd0U-uN_e_j{$`@%eZZ(p=ZB1A0q4K=CxWx?xbQ;G z&W%Km`&8_C=)|h) z8PtLm&^#C3+{Fh0XJDdQ83n%W&yo-mg}w{&gq`iy_FW!wO~|51-6VPk$;b`t<<=*0 zPZkw>TnLN>(v3C`jbDmsp`?mixx1`4nB3Tob6TXN)3 zQs$V|`1Ovizv^f*S{aS@((lxvLxnrwjZ;W^jgY*DfN&{%(mujo%=k>2(L*v9M&j3+ z&#hGX?=Jz6`gh*{DwS`f5VKaIyEf1m1c53&A@KvB_P?7|Zwy6fnQKJ^r&MM!BWZ&3 zyOzUWJOA4pch{;zYg?rIC@^{~V5S%l^SL*8acu*aM=I{hUdsuE*8sV#mPQ7~S;`r7 zvviaqO)GMbGmGZ5NfTw&gq~X5KwWOq;qU@AU}x5{xvfT z8nS`SX7WFtMD1~91lUgTP_c(GFyd(F2vkePux5cp$e*hg$C9FZIuz6#N`JUx+&>sG6H>wRU>CH)r*sLtWvmebEhpF!}dgN1722>+R;W|0Gr*Y%K z{8Dquyc=CbvktxCD?Y1AFQ9F{KWhPF-`kGm>e1SrPu4MeE&2UdG+eb$muaGJ25*DH zY=76+Sr#BB9+vKOEeH;>{vefxW`jUSFDFe;??*c9sVsUL>vpVc*Y^{ml-ZYBuA18A zyH>`nKtZPaE}lzUzQ~|~P8Hk<<@n6wj@_MikE zsvSv7RE#tj?k)cA@Ew!e>D(ZGXrlz?g78KhqayD7kW?au7Ih5r(WUpvY`u&x3DFM2 z8A;ehq^UKoK~Og2WN5&#_=_^mDtN~#*Y~^Q(od(`yoatYw$y2FG8#--=V)hoovhPs z)n166^8`+2p==CW-5&ZxGt`VZjyvKK-Tt0=WbceW(J_q%u$N-wOw`sRcSIH9DA?w= zxWPuuM{~eaH;>%D>KxJHW9Wo_;L|@NF9VQbij1LI`_F_(ojVDXb?U5jmCIqS+$oi) zBHuItpYRAJ6?7(q$~3pgx&QW=SOGU@e6QF*VN3)HwAd-@xASJF!}o>)T+=XpLVb}y z2F^0&o6v{&TdZtfz*NIKmB-OxPpDE$LBMZKqmos&>1+>d$D(~n# z!jJJ(Ex1pbEH83mD$K06N>IaJk^K3@|KMNUvhzbPm%x*W^pC7K(AqnXv;n&{gJUZ4 z>jGA0G?ZZxOJGCKn@Hc5Zb9Rrl9t=~1LNSNcWMjy` ztfM`~-AY*aI&esDAz|iN@v~F6uSUVgLaPUv)amcMJs`0zU<%s3~yd(XV_OIIJdU3Wfa-t zEA{TO{ul1B?3?0D;0q21P+u09;LqzDui5q|V2H9IpUX742aeL851me(h0@qpPHmTP zBVy7vYx`2o3|gko8stS`*jI(Q-0{wTKUQ|=uHly98$V{PLW)zXyG}nli38$AGeve*$P<-EC`7h3F-rc z2OCJPPp}Sje7*k5518AiY*ZJ(Uorf4r#)Rhv|Z&Sw3D|UUPp}p!vaJ^h?N^Hdgp0DuptF+Fl zF6XTMbg5P7-xSlXvtJr@PI#+(Cvdd$md;r8tvZqS1dGRBRnNtU&r_vL>&X~Pz`|(C z{NhvuBH$uM|CQ2e!-1%5_rihbPY$}=MsJol`G!RyjO3(1{Yuyq`_1%#gq8CcLq4S_ zhnK|c6Xk{zyn-b@*Z(WQoDMKEQXrV@LGF4yK;(B-LGf zYd*?bnff~2PR@o!{S2JPhfo`=0J#NL`cr`xAqaCYHMD{1i1jjgwfs|Q)wdcTM!xQ7K%f)*$> zV7{XM9q-`wXGKC|+`2$*zx>6!to6jCkC1fyOOv2`2%-ud8k9_ z*QG=cp4E9ID{B?wuL&M6?jDb(6KB*j@b?XH+V%)FvP{La-VeX8-M=Vwroge)5xp3q zVu*rs%xO;?s%+lCrzG{5Ybf3WWxzSUjq(M14I~hP(r8ZqEw=L2Phm3nI)hiy|X zL0VrueA4hY-oEdZ1F4^a(#5m8$X=X9TL%&frwh7GOyBr(!Y7rC`P^qd5n=Z94?of5 zR{+Ex<~iaGN!ls*@W{zocL3m#nKMX#@V9uRM>VE6a~R+CBMLFJ{#9%WtcrF zntQFZV_GpjBguzD9~qW|5+U-Dm3F;7FQK6TI@y5*I*Y5hSly++lZHK12w;BMgm=#S z3eNC|6c||NBAD9kgLiv@{8yxRJI;j&Vb!rSMgMvX%&!Lob_x~05t34a7>{XrSlqR~ zN+dtZsXH4_1r%<@}p@i z8FYI(7@#$Ulr&9^uj|o(EIs_j5hk~mA@S4$z`pS+EoFA9`C4PICrTvc+f+AezXTsc z<#C({=AYn&r>Lp``vIPBwd8v8x=PlHMVgv4Y#4YbQ8HD$)1-E*Su&&y*@CcSC(nN@wCi`p3Xi+1RdLDSyXzoZeTBXBbEGBnta zUcDwVTxZ!cQB$1l0(Zf21C1pg`hc}o_c0k2tPLGV|>4LUf>BIgNw{_ zs39@H^R;R_j!{1)ODJ)IX?KypewFT}f0U}VL}kTE{PA0=xM-e#9bhja zjI~m*(4^7~ura2;F+}McT2MyvR+493x-$nBDo=o%vF3;5zCIB$Rx0#SKFySs8OZ|NG>W1SPOU~5;902u)z#E3lHsrcAn^1--} z`FF%>xi~4$)?+b@p=SGkRoq9J?H@S*C`51ihT3Ymt^VvUAi_mlA9|!c!HBT%2=|(n z0$FVAHtz09fXmlf_o;TVw2WgZplPXDsTP+H1mM63io{*aH5d?8aLgM)dk$uNB|fR3 zVixv_IJW@-VS^pyi@&w}5N`Xy(zl4?2F}~_;Rd022gq+{q6*;z2o0cMN zMea&*_Q)X0t3ehFAGQ((=#YWo6}qOcb{iqE}_Y@4-Vr>LdZyf z{UjnHSwu6>ymOp3c1+r7^q+Ik-so%*+Q4<{qhuS6>gUN(F#}uUjOphkC#?NFJLrn8 zR=56X5?jr}fTk2mEhpYPMQ)&0TpyEa^Alkdg=$dA7ateXEaAv1sT%vnTa%0s66+&( z@G(Z((5p-s13P zBDnlHnZps*g0e|uM=(#<78?oclyF@`%BL=$2pX5N9@u-&RN71E8YPVS(C63TUc+D? zG3?W?ol5SYr~WDC7vN?=`mL$^|8H30%*TRDF;s9AAXjb42)37AA=RgtSTa+>0>h4Y zU^V#2-78%#9Shx~p?&i$TetEBNu->)%n`olkIZIi*|9yiJXq7-j!y?3Oa48_AWYLK z4_4<@z)j!6!8LHgELBrnl%QWHj)=*+Ep*-GF^HuJ&8OqPl@Yyjb^ctp>)$6nEu)vv z9noiHd^Ky#pcF?iW(DoStH$;9G9u60ywp7Mk>*{VuHBzzRV{?mR#pqg^ImMAG#TN| zXaXJ5JFcld3a?M06@#SO#DOshC299e8P&Vj*x~Kws9#y*O2?aKPG7b3^obrQuSQ)c z>KEs@^6_sieLirXxQL@~-Tdz}&y~AB0Ai5Lv&4;Y*|Xi=MCF61&{rvFn`Y0i?SqoBOM0$-RbTP$S(dqYbYjzKYKr+(gI!bZ);E|Ej{$#ruS(5p!`yo za{)T-v$;%oMeO?D0fbYY){aHvNm3uVE5R3VAXQ?2;8JUA(1#lt8f~Nx}JIX zk4@v<(bg0dAYaH5LNkoP_fGUViyEvNp^G&q6yCv zE`NjGp1-vlPv8nW$iE%dxQ&9{oxeFLE{ zl6rXh#N07=x^yJwh0Z)vhcB}azW13vnoSRz<%#8s?ly)-7W%Ap5ITJmn#TNhUME=b z_eqOSTBmtt*ih(u^Ux>U=_GpZfRQC-or3{=S>7u+G6L8+TyTgFcHn6lnNbKim+Q5I z7gnp0Xdgj1oH3-j>>V_*>Ky}`16a}hxg!i>c1QDi5F8R&$iE4=squO?OlL{YML%eF zZ}ceWzN33b>2F$2Z74}()|K((#L_xO0rjlENpmKv;BfB#h{W!%^9!|@88w|82%$c# zXaty1ST=I+s?0{Nq=8OUZ-Fi~z_NBu;eg4N#t5Xa#RR;56$A-aLRUVW z%CQ{;g4*LEa}Dqr1>41kuXR(CHu_et{cr4d0p@60cC*aNdUJ=nz+#!x%t{Hc7420~ z=Jz%oot&v(@Kd|uT=e16g?jjSkTZSK*8bxRWPC=KwluR-%h~KB5{w?5QA^m+v`Z%! zo~zO(>r};*B^g${Q^KSSnn6J&Tl@fXtl(_Eom`YkNzquc8@u}FFSvzqp||{w-a+7S z_dx?mQe@;1d1USYOEi6S873k5vYj{lx>6eWt&L+U&-|MQfngXU?p0a?z@&&%-O*c%2j(8VfZyD8<|X&oYOLT3XT3=W;kIs zk_3I-Z&NMEBGxJU&P!=Y4@QLgI#3IJH92}%Jce?6h+YOV3A20*@P&&DxzzmO)O=1c zKr^fm+ZIMUEpmoMiS(sUU5W-ZZE~}9gCSzg+hSi$D3eFN1 zg*F;aBqE|Od*%A7&^;tDJVqjWr@fs-Ik#^k6e$u_-$jK}?Fxax5NW_fw`2B|7WY=P<^fk=7w>A=)WlNsnlp{-}6 zB15R4aMIy_g64*~%ZWma6!xJ|BkQ#S!)3X%i3nd4f61-j-3H$tD(~R!_X5hFmXErrv8!id z;X)E)#`X0@X{@+eM>fioKxq_<9+oGGJ2ZRXQ@e5;2P&ikE>hNdZ-)fapWX+c}z zPMM;uzz}V>XEjS^ql+DtLxyj{J5fm>E+%?mmj_apUinHqIIq&~U%h5$UjrTcQ|sk= zyzxd6L)rip!sU+Lk;J4CA`iwt3ts;iR$&in4OSQIWw-;OJzq*9MZ>r9+oYIIIySU%Za)Ra<@Z$of>TF$f4BUc#B=0|P(pBVAH zj&foQG4-u}QO|lbSu+Qe^VG=VNckYlYP;RHQ;4j^s)%-+m#3z$l!hBAREW=}(Lc2& zmX%zZl8*Pe^GCrMRsfZC& zCVpx9+=kBFRkXuM5pMd0VuR)~O)IloOu2RfLbEt%{mhpL+ta(6NQvMU-tEb}_37Fa zsgUY9_{8IKuecx!OxR4B?!*tol=uoSJbxtC4){R76v9&tj{uuL7Fo)9TDh7&s^}k-9bO{W3Rg4`DZ_4hvfGVT918`7`F_`R($aJ+Ir7rbnNo`)7M=zZt+k zIe7G8jq%W_UOy5?OR2=Fe7L&9*k1Gld(&cNvr*JduW+7nI8M^_uJ|k`AkRPSZ+F0D zA*xb5<85!m!-Z-Cfn>LTUre2=4UaQ79({r>=C-*;u9}q*Nrcq( zy(K_4N~ub6(9We4kpo^YbiIGdO(DCZ^u%qkmm7Kn33a+(Q)-ig8Y{KY7@-)R_SYZy z^vt@`u`WOg`DkqUUhCKG_RY2pwx;<2GHbTr5ph#`&LhXr$igngFwMed2$W{-)#Xpj z@x`}lG$(NUkheMAy&cZ2OfPj5thzNpblz1xd65%Q5lei!sHV zSeqxIbh*L@kZ{1v@cT?^Y#Dy+T5OuJuS1_yTPWX%MitLx%9uGc=7`z$$7Lj|q|5F_ ze7p+YI-2Fd6DRv95RI{B$93jbpeayI>Zm+y>g0`2YHfuV5}(au%sIe8Qe3YpzK+-| zG3Uy1DLo^T6P&*XThwYlpbkmRY=DjvtOh`tx<#Y*!D<`j4zH~WJcqjnI>4E7{l%hE zc50th1$^R>pJ{06+_T`&m#56N0`d9phi0&e4n1jTd1sP&-I$^V>yu8&0;2=AC#xH` z0HjyjyLZn_TWx^37U%;Hf=H@T3)sJC{hN~2!}goFfH02eSF_2$jL%r!jX zZ8RXEKyD7W1?Q+rp~UK$B3#2G!{(EK=aj>gbKNt>FZG&{d?UqcT5Q`5b8o^#{ATYe z#&%*2J{63)to*IBapl{Js~9`bU!}=x3j>5tD_0t0E68L&YjK;8Q)Y+s>nH2|j#@W= zcwLMwlT;)0r^!ygQ@B1Twi!~KP=GDM?+jnxRQof!RAunnRMi!?gpr){KQ<6~rrFA; z(|xshF~j-1f~g0|$v!J=WS7|?$qih7JnWo&h&M9enbX8Pow$@FOFJ^A1s(UxsRvEm zO|z$6zQzuG!BjP7$hVAUOSWz&mvncYCRJgC2g|=NyAG7|b{2RyreSrd232wfB+6~!04zpxeUE}2C)C_ZZuZebWaMT2Gp5)3qN_C@xYrX^oB$#yX%o7s~&3Nk|*z!Y?UBqq~ z-y?gb#R;x#7GVg|vCIHaV_}u?+SAI4lyu=rDV53QD*Ry)X3WlrfM7+eT>@42`9&TO zIi;H*zxIA5QRVVfVoZLcQewRI^jGZT*3;pQ>h|rn4Y$sVAK zri>i@p6X{`S+E|;WtZ|pXgXce)~};bt~rb>e70-+1d9|~+qeT5V2P0qTRqE(PNfkTabj-d z;l@E*nW}oDm^hVP{wsqP_Ip)K5WEF{lnNwwy(mj`*gJ_$p8?lBtKCj$i%H;$9k9__ zAsy26^)QXsY8pK=)AC0b>2jYg53?h%T9g%1c7~97dM0W{!%Ao|)Zy1p#4H4y2wsD< z1u`lod7@FItPNj+DOuw3X5*(kSr76P`=3?lTFQ=zz(5B%I~0}0%OAKbnW5Z7>P&^C ztvZ_w>Uzd|hG3OtQhnyA%|yCK^kcq}5ejJI)I%8$0--ua=~-q6GxzRpC(~32>2cIu zz_@w!^pK>T9c4>l&GriUd2<-f5sgi0)ZbQU*YYyo&JD);#Dxd9=m6-~r!PXzySPV-qhE93<;~vo?IWA0Vt70}6 zSEL0W=;YN~=EXjzeHT%^C=3yUbD<0HKQi?c6p4b>qNKe~e!RO@5_W zotUySb&L3wQ1-7|Bq?HOtgGp7VUUT8#^Q8_t*bENV9HtIM-oNHLl>_hYRF8SQ4YGI zRUrRuxKxQC88^L456G2Z4t!VOGwk>Oo9EuSyj8MQu%-3`SGo_kjH+ptz;}*XAGDVZ zTy_l#VUk#}`u)6*Pp{R>`f~MOF%)pm+!ZO-G`CPCVZ@Bot6s1vwD<7 zt{Os<#)VtKy!3%VB&x*yWm%TPmbsL6fWIi^EtB1weYs@KUXJivi?>~J_F2JrySFWW zbin2P{J|e_SK`b^`W#2sTqNp0lwhYaY*!yZXGg_m&As35nA^sVD%XE-WD5$WT!MPP zp=e2>h?kqa*p9!-6oi2J>+6`0cI5V?dOb^F$YF9(KtYZcg2%Ldd_$K0hdhZLXsx<3 z4zr1I`hV_)m;(~JHnFmv%tn9lZF*Ykyq=%%{VqbS%S>PZG8_#I8>e(NJ|kW8?Wk-L zGX*=5HqZRKFdej-^6vq+P74s7&&c{pWq$oCZ;Kn-p}O*~u~~O=&D&4y269yik^zBHLRT&_Xjazk_lpeF<~3OaEnhI=^Mcq~8T*e@ZwP z-?&ZgCGRC;)>=b|d;bz2k}k!j1UxXAIcgV3K5YG`L@*K&U@x11Uk@oY_?;-_CCP2T zQP6-?cK-IZM`A-3UXPlWb2BWDD8QS10LYGC)0~lLtH;pw|N3jCG4bAR59v92 z{Mp8#)$Knd^|nk54S)O=*u2u@w~DRDQHFQS_2Z;Pt+_Hz(;Ox|Mcl$+98l3x1_ZsLygJaEGJ4+rWtO2HeI znAqK;R(%ZPj~ex!*Kn>b<1gYCbS-gWp#~zT!{IwfuQ)$#Xrt8RB{hJ_Vc11)_-O7O zb=#tUp6Bx{$Bm?5a`qQj!SYL9J`~=+RBahkWauuMf=;P;VjcWggPvjPi;UO$W_#-g zvl=~oUK0$8DPs;!Cm-8wApX0$mf`5KFV+TT`BuBKq_gEaa^Qwz(IPDzNww_=wO8c4Jj9gZR8j^pOQMh+=id=z(Do2bkhQ=J?l`ZQ z_$R9=xsqM0)kfCMSm@T#j^`-}Xls=+y<)7HGt>}Z7@k*-8Ou6jg|m+-Xq-c}Txv#6 z#({|yqhh4h?Y&9~t;KuO3-JU1<&VEGAP}{lH*yDf>s~7mtEE_YMdm}MymS_`Hzfqs zxHQT{SFAxSqeoog*8^vSZ6=NpNPq3CzvqoAi^v~O&3Iz`yDCkdLRI(;(mab$q+6%? zmEXp9Q)K%U$)R_sNu<=Z>5z?4j+hW_m37}yIOt|nw*epNeVgofPR!!xq86qx3hL7} zJ~dA20-x`KWEpg~a-O=cY>Q6oaNL=P+CK-q60q={^6Mg}xs^{R&PQ&?$VDxcc05#5 z61!s+9hWmDtrL8XmpF#|e*DpsRzn~I0wqjoWLdSzug*-rw+7#f1Uypwq{)}qimpW7 zKei3GNNo9+e^R2}_|<_lVLEzlU%N96s)-nFQ-z#?$;vqRUI_TO4Sk58Dm#w$XPnJ+)H zXRg+i$mg=3p4bNi)hQLM34K{=+Vc_WQoceggGjdUU%Ay4oqdY@$?G|-o`y8ixkBVW zikple#Ov3`@qR$28UelrCo-79t;tGW0vHo)JagRHE2t&$_!hesFqtiTA4$W0j?|9Ue;=dq-e z5_6S-P}<@mOctuO&OG8s*~s9#`8i?4bM(B4yywo&>lqbAJ!E{AoDw+qn3;mA(oy{G z&(?;$*qwtvm$gy9g<8Itn7xJt?zFsw(j;#eFW_38-j_>Y&FKA9~wh$ zY}U_JKTF|;eP4bLNK{+TSiE0Y<**1Jo}Thw{N&kIFf7w4dFO;3jVcM^CXVbSd{u$L zzL%Bur>YUohZzK&zN8XHyu(4c`Ud%5wZb>WiXUiZHc*j88(f^BpUdX`SpA=4K7hAA z9@tUKzJjO~c71pZvSk~R*PmGSv&v=I%>M$3p6adtbFR5qENCH4*F$j%P`J?7tZgn5 z4EFi&jrr$b>&bO-DP)MTth$oH$D*TvrPntO7T2SEVq&6I>HAc}+`qyMmW$j`&^m|F zp=D-TxH&_#tkc325E z#cl1Om={ViU3>#&Y$?~%eV!mdtvBB0WxklvIJznKNqPDJrn?FFvyQv%#^J^30ku>X0^nFntg5mueUYn})hBu&5guzJ(yK zr&4uIxkXhu;`_i0H5N%nWAR}hk3^gMp!FuZ`_!`^87NrWUuilyV_3uEGwU9Rue);s z$k)B%57=u+OCbI4MLVCMZUl!&bdf%#GWxdSc45owNXs~~B zyqgBnnqd$DIS#9hsCxJuw!UTaQR_E~DHmUNshG)-mgAsqHPS-L+hnrK5lA=G~CER}~c^%BQBy7U#!aV@A?;pGSK;#(%&U|~K9 z9VJIQ(;RQSoN3y5-wQa*On(`*yMQrxnTnWom5EBYIAfD$(NRmbyca7xRQpY!j#9Ja zT!tc>34ilXgfEUiGzE2iVA^R}QAYR}0ERGCGQk)kYLM>n$Uc zR?vD>naW9bpg(-9FckNfT8+qfVDf3YDih=k?UMP#=kY0!4O{a|$+<)wdK1Q#B= zih|wTCCehI!7`9~{?OBY;k*1gX+`FswYKEzO5WWCCNE;hM6NS2g$=ku5fyLte|3Cy zT+>na|3<2mO1B6|cZ~*-28q!n0s@kgPARFOAfu6n(H+t-K)O35Hl;g75ZG@%@q1p+ z_x1hmkL`2sJ?Grd_S!l3bMHCtx6`OJUm*CeLwQp$&j9c8iY=(&Y~I+6_7}i~Yr`Wo zwPw$-UiQJm1%J9Gx!2=(;O}NLtbg>pf{ym)3hE+l87mO4q1Y-MrIs3;LT~%ymJ*hAGdIfC+N_)sO zS(P-+pxO-7uXH${#lU6)c0yWRS`H&jk9^O08kE4){_#3J2*acqg?x|i4?c@8;o%eP zqb~9ye$+Le+L@%ZRh*~qR2)-oq-bM1P=V00MeFB8uaGg*$8Yz1TS-yhMW|17R{ zQ9gh8_&FtxXkt0EpzdBa4-fuuVDXIV1%>C+RsBu6elBBb=TTij@J{pUt9UthmUU8j zMy=-bTxjp!bL970J>3S3WEQmV2JB0X*&4Np^x1HV%}e*}#h+j+UKprPwf2wQPb;dp zBwpt9x40=a0Sm<$WWg6cI%J-1^@wE<9k1%RrT9_=DwaHWt94_iN%RY59LT+^3(-45 z;&3GCzXM}-_Bkf_l$<7*Zb@N>bvib7;{)#bS!5|w^#s?@aEZ)3^Ur&jECu3=nzT}_ znctsd#V0<>rt<)*_AXSTG`hxwhsdeot!2ZQ&jlab0e=;~pjLR6XJLJFJy*t-=tk0r z5zeJ?!evH<5v_X52&yFC{YDOYQD;`gtCizGLOHDK>}DQ8Aky8HrdyiEy0U+)M{jhf zzhQ2vLo%Y66C09{ScYH3((XP~E4OKi2$$R2_Ut@OC}Z$5g$MmUuV6cDyt=8sM%rI= zln%Fqesmq=jB1Hly-t(=**N6*7+%)}*4q00Lm66PJ9$1~Wute5^5Cda1z*N~yOKbm zs5q+h6M4OTO2>`PseAPr*;j;C)Ru?)n}A;*<4*pL%3b>9l^ zlv_G1k!BN}c8Lub!_BY9!33+5tKr=4dbBiM)2q1n+|`h`j+!p+zTU{IEUUMFaltZS zPx%i?YW0i-+fRKniuyuO{Uh2?g9I|T;bpL#bh~vOCEQ*gUf{pQq%D?VHyR1IZ>YBS zvt~P<5kg!R4&}|VvhM8gAi%?jKGnH87Ijs>Kbw59cmX|)Z#~BvJrCX;1eUpbYzII3 zZgw-~4PmWVG>?ssjf)Px<1}8-Sy1E?w>uY2(YI3r;_uuEDg?ImN3C?y9cl z)wg*7OmRf<#lB<)x}_lOgtcPw5X#F`J>~&-%Zp__UL*r{oPJF#=T_J83&0;JZY8Lm zR)DeAagOLF$~3k)fQKG%y{q$Lt^3x zr+~U@x=)wY-xLS0+U^yH+SC^@x;6@D1!f;Z((x?VO!?uE3)8VaN3!K#O!!uL9`)!d z2yB<=5o0SXnN`U*k9;<2@0BsWkcT(^*0yfixXx*G>g7beZBgC+?VIl?sTd1OU51L! za4A*4-7n0LEM7vScZZ0ons2?X?uh18D_g~bRj})k{r+uKK_VNMjX;XW;$x6M32uiL}n%VxZqu{ z^nDm2X>VkyWKx%V`14ed+QBJe5O|}}*)b+b8%vum-B~o%Q6n#(gEcl`{v8KF@KlNF)B@73X-9ej^LKZ+ z?I$X5NRm znOQ+6J7*}oCq70$*Z&k19|yUhQEqaZ+a@W%@{@ep?9@WRHGgDxASK@O94>P_Zr=qS zzT)Ha$d{&+W|ngOX8q=FcYm#1$^0&T;$zv{QyJveqIPrCUgRQ1H$bT5+rWg+I<-~GbpT2!Yr?BXS7Nta~SK>DNJUA~OeDr#~wDs<$rL*(+ZhZ$V<8y%e zuC?a+QxUL5Z+_6`jW8>7_8t)Ly!u0Mq>&*Qc=~NV`)*otC``=t^aaEdICGGjXf$4?AdI zE_?rkOCj6yO*1cvsTy|;@H6~++O;}QR{N(515fYN<8FTa$Udy;vLePTQ{Gw}2%bGIO`}_sta|qcvlaI2Y1n8x0*vleSy9?nh zp(VSnBzzgb`}2M4NFeX=Vyiok^!H}3_JxL>jj@KE(Xoa-+bxiVZP?=CO2brtk`Kv; z-g%>-iZ@EYu@rn60!&60bj_OilO>I4*1*ZzT%7vj?dfb>#~o@tZq;vBY%Pl&Clme4q}v+kaP{Yp``&^?2tE_d;iv7tE^hvb#7zV1g3jNhjV z@7&Yc=IZKF6{Lmnh<)bzf#Svx`(&thX2whyhPu=7)#WbK9=tanKvlsM$u)JfxK%LX z;xF}TbH9I5q%$k9=MPz-I4dGsD1M)33EXU82cF>(mE zq;VlEp+jYx?;o={@XQ`=VujF>>3hvg=fAsU1@%V@(pvF|*L*}sfZxD5c4=(_pMgL+ zwhCpeOSgSuG>gHX9%U314vk;52JZ>|HL@3rDF^E6ukmT6W&a&zg*#Q=dvf~>)UT>G zhs#ka!uWyWk6dBFR;<*&X=gZL9Sf16VPG4BRyiflbt50#Nx<4?Vx#}w7#f!F z#vopCCoFpuFD>8l9%4%N+BvcO5;frUd(6ATUArHj5pphUEYf;jg+%GGma(V_y>Fnx zQH~z-KQ2S>%hs+&=Fi}hmrc|wLISx!AWhp1ILk^cjZJKAAU2iPSKXtYzjQ}8y1uy0 z?|)t!A4Ae%Nr`#q^UetWQV$t~G_<{H1W}q`12>*B9Nf0^gp`h`MNf5h?w(`~Mb=y* zUm)Fjr}7x6BlaA-x;O;6Y;-UWnBq@BrI+Q$SyPtlMoxLUsU6d;A^tsV+*Lw7a{;;mZ=W zW-YdaA$LajMZ+2t@OctiV3&?#KQ1(kbnN7cjkQ;*Fj4m-Y*ie9bz95uGG$|G{pV(w z+zPfoJ7d8U{%gcmf<(YpD(<`3J7au1m8*?m%(4->u?nUsA9&&v*w;ReAy;X<3tVG; zMMIF5pFP);=IsjTnhqa3!QTj@z|eNJpQ{b?A^}G`b)LwRtV1VAy{`Ac^kYvIZw#kP z{U}yo6EW7x?jj_j+|g|FDjk-1&SSROf|YUE<*%GwnICgIyh0i*9y?ucEL61f@kDMr zw!^t!QEdf<^}1+}ZJ1?H_@Z!y#s|X-x2RLYCFOK(NFD%DKECyc(Ma?R>CdD}vSJfZ z+Y&wwbpH!yy!P!|{=0>n^tc2CbkY&MpTW&S1?jnPX6mu?c=CL`xBSVU=#Z7cPR z)HqY>tiwogW{&{%=O<#N5R)aSgqHHpr`!*83vuPDO88mskjI<%O6Kno-6wmgV!iO4 zL8ZzN+t#k-GbPs(ghoto}If@2l)89L91guvPY?Bnn~|n1p4>+*prgZ zmzJAkB(UZ+d@pZx*D?dl1f(R@4Pw(eB8ocSkKCLkNuiw*x5X7FhpNpwyU);65=|By zIzLH9pK%PsO)GbkYdX~9D+WY!0-r){F6s;=*Waz z3XRS^tL~~|z>p+K`>rY>>Ct?7m;Cd7uf%s}z(J?87h9M!mPT9vh7gnP!26^-w_h#MlQo9H{EQ_G6TF!w+5P8_ zWj+T5$DfDY;KUU$Vj!7M&_L!L{NMK(Rb&w=*J8U<93P+K$tMPe&P4sIPyP-|8G~c_ zk78_#*=77!NuIfIGx&?pY*=X^QtZPer&d-P)&G$E&lKCUuk|>%^4LH^YEN7Za!PR& zEdV`voX2?dk1)5l4Q&HPzR*V!N<6Jx^O?(i;PP1s7TJeLK8k%2ATR%;By!QA@}u;j zXl1I$|Dvc%*fXa4xI_c6zu&(rJR6YI!5 z!sVac4euU*j4^UA@929Mk;);`_27}w8uow&$)oyb_)$xw*x#J*hx`!zfH1*9nAXmQ5OAj zeYr6~`hY6vE_1Ni^_l+?Kl)ZO!EMEbNdWtdy=wjuF>RMd)vc6xmhKUQ4*91ewBPzU z1B#rXPOv;e)0Vf4rre>X^c#`=DVlGMPRo0PL<{IKL%`B`%656m{;JEI&@Sg^<9LU} zV2|Y+m*Jvy8XYsuNV3Eeb8)X}`3yHyx!A6F?Tte1hr^O5Q~3@rDyVTPytA-xp5-mlO%?%6 zXw2LZc)6LzlVoB1Zga=q#Yz#7c_5%1k`;l*@>HK8Y87jU@i1;FCs2@N}BIhmd z_Kj#0IVuxy!-&MmMg7r_b`Xv4F|9rK;Nn5f{&lx1wg#`Vf)l6O z^$j(sznfmw1_!bNTj$i@HBmqBHJizil*mJLTjjdnXUoSmm&Du+6k;)NEfY&a3&{rl zuPAc714-G_NVhtZ#`D*CsU6<%)APT5ybAF8Kb}cIOng_s9l3PKeT-@&G@tL={jcHw zxchSe;D%zQ4`l>9xs7g^RM}O`diW-)!ihv%WA+VFWMR%M2M;SS%Gr)jG8e{ewbvt~ zZLX_dkH8Ss{(UJ}o;TfEO)`&jHUP#;J~5`!QnuP|_&%cYmixyz=54JfY|I*Kd=9tszsOXOzTB19lVSyifC!o0RO2k z&WSzk_(8zLh?wFpPO8X%8pR$HEcrScqVP!E$rL&u@+m(mRKNtANJWBL>@Yjnkgwc6 zrONVVusOH!Ue>Ol`GfL*-3vuUcl6kqf+R?(Vws;k_|VQ4${-(&9*EI6i<4J@PP!Ks ztc`SShW`{ja1CwCLA0#3)s8=P0p1G#(*W=^Y|4r1^&NrxL~A_id17kq>|!H6Y4G<6 z$FfOMF2`ACMI@Q^KH{I!SWM<}+7%4m@3%o?laeZYsT!d^u}&uww(|aF6Vw~d-&4;S z!Y2Gkn|OW5zZq{GQzDk4Q2va7zQpck(hi69n)^oSLq#iNv z8@{d5b>cwXJ#skv3ilJ2_K=ORVK$0;cLFrM&e@OLhLq@sO4#He;AiKl9bL|=-QaUU7S6-jB^ zrKn{+p>L~VBpqnE_d|qN2yN>V-E=wN{P6Mcw?zf$I{EWa$WsZeed$K#c>?t7t(T>r zo^B_5`Jj>xJSF*u{Vhp%Vakpwri(4jF5?885B$B``seEFgjkzYysyxYJh0RR`6YWw zp@>>)&D+Fo?CN+WJRS|mXJvh@at1P5bGv&6QY_Mgoxi5<#a~#0Z{EJMQh5CwSKzS> zz?A45x#&0rte+ai3yvc;bl`z#c^I#f;5e)L)CSg~8vLqxyjhTP>a237(J<$zJPJh< z5ho48wOaGIN=YEkmT!C!+pL$;*IAk(m%JU&Te*D79;Xb$i($$0M$!w>JX1HX$J$)? zr@~+QGr9UX4|y+%?X#`osW<3G{qfJvd!#vz*i3_d#;nZF#!d=^PNSZC|J-}gI7*#&+5c+)>qT)`F(S4y{E%myir)^ zle*f>sfqV_PNCa4b9oOHAA8*MeHyL&L%iluc+gYFpjlJt!}GJlm)~P!Wyhkh2f5fu z8T>l~#qS_OJ*9ZK7e=#;b#X0jn#mW89J*fpUp+3q^uxtmcb#*gQ@DaEH4G0HzL*b} zr}9Tx$b4P+6L2MbzfQl8)H|a(A22UpNW#*bQQS`VAl=`FU*kvX7wX53G7`2mO?=o< zduzD<^wyLo^@-lf@5g3KbzzQA8gon(Yb>FLI5BT=RP^by61^tG>&6eDED^)7U)Oqp zQ6tE#r&j*ml{@*~0{6!J^`O?qxRo&mK-oY>RNuq`N^wVZlk^iLAoW|ujTj3g^4Am*Ilb1tOQw&N*?L^It10;<&vcJ{J$)Y4mT`Jt zif%zKx_G;0a#VLJ_X=$t91?RYIz^us{Qw!~SA4SI+prlNeNRpO(A~ECGbB{CGkfSV z@Ac%A6eS@VaMQ|;j`uOP;3q|u?I#vy_twmmgiq2I4qm}~Up2^;w$4wP5< z(y)Qr&v{!&Kkp5j>6?LI+75%x(TJ|8H|`s~>bE?Fxy3tIH#c>q?{k@tUXO0RY?cXW zB+s8_TdN)X6Fcl4^HBd{FP4<5m1JWuv8n9>J)piG{jRwAm7(GbA$|(E;ZfW~cG4yV zzMSYjX2TvX`mebeYw0hF1pvytg_UYYgWnW4qhcmS0r(WA8Hx!LH|ka6)E4~vCui>~ zcP1R`ff7!tCQ*^XrEDP~3$gGm^0=I@0JX8jfWr>Aim@$z9$3{#1FIob_0b2O-AX>c zzJ{+0MFY_KlfA^x&Wj$nv(Koy00ySI=cC^!xKoS$EPqrMf;AfBL)Oycxi4!2sOD0o z=D<#h1JILApbons`!}Q31s!vqSUs?CfJ0mSnD}hovpem;wl~=hQ%^-l*&x*|G7mYyvsu;KVcKI1*ET+L7{psUkMakD7smXnGfbH{hUSjf{YnU#+UxMbo3$xFCcKeWu}`@iXFn`X z&xXjXse|}zu;~McWDnzi1F-ZpGiK>@CI`;XYevFn(a+D6CGb@Cs@=(a4euW|J2l`E zvrH5IYa#!~2e7E%1dB4GscqkM7oZIIET^e32e!%>BOT^LI9Y{u|x`#RGMxKhn pG(_Vvi*agSAqoj!*3xjoy2Z7Xenf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/logo/light.webp b/docs/logo/light.webp new file mode 100644 index 0000000000000000000000000000000000000000..18b36b97e1a0d6b433633b2ae534b4cb00edbcd6 GIT binary patch literal 23564 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 literal 0 HcmV?d00001 diff --git a/docs/mint.json b/docs/mint.json index d6f7e33d..48ff1a12 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -1,91 +1,207 @@ { - "$schema": "https://mintlify.com/schema.json", - "name": "Starter Kit", - "logo": { - "dark": "/logo/dark.svg", - "light": "/logo/light.svg" - }, - "favicon": "/favicon.svg", - "colors": { - "primary": "#0D9373", - "light": "#07C983", - "dark": "#0D9373", - "anchors": { - "from": "#0D9373", - "to": "#07C983" - } - }, - "topbarLinks": [ - { - "name": "Support", - "url": "mailto:hi@mintlify.com" - } - ], - "topbarCtaButton": { - "name": "Dashboard", - "url": "https://dashboard.mintlify.com" - }, - "tabs": [ - { - "name": "API Reference", - "url": "api-reference" - } - ], - "anchors": [ - { - "name": "Documentation", - "icon": "book-open-cover", - "url": "https://mintlify.com/docs" + "$schema": "https://mintlify.com/schema.json", + "name": "EmbedJs", + "logo": { + "dark": "/logo/dark.webp", + "light": "/logo/light.webp", + "href": "https://github.com/llm-tools/embedjs" }, - { - "name": "Community", - "icon": "slack", - "url": "https://mintlify.com/community" + "favicon": "/favicon.png", + "colors": { + "primary": "#8B0000", + "light": "#FF7F7F", + "dark": "#8B0000", + "background": { + "dark": "#000", + "light": "#fff" + } }, - { - "name": "Blog", - "icon": "newspaper", - "url": "https://mintlify.com/blog" - } - ], - "navigation": [ - { - "group": "Get Started", - "pages": [ - "introduction", - "quickstart", - "development" - ] + "modeToggle": { + "default": "dark" }, - { - "group": "Essentials", - "pages": [ - "essentials/markdown", - "essentials/code", - "essentials/images", - "essentials/settings", - "essentials/navigation", - "essentials/reusable-snippets" - ] + "tabs": [ + { + "name": "API Reference", + "url": "api-reference" + }, + { + "name": "Examples", + "url": "examples" + } + ], + "anchors": [], + "topbarLinks": [ + { + "name": "GitHub", + "url": "https://github.com/llm-tools/embedJs" + } + ], + "topbarCtaButton": { + "name": "Install", + "url": "https://www.npmjs.com/package/@llm-tools/embedjs" }, - { - "group": "API Documentation", - "pages": [ - "api-reference/introduction" - ] + "primaryTab": { + "name": "📘 Documentation" }, - { - "group": "Endpoint Examples", - "pages": [ - "api-reference/endpoint/get", - "api-reference/endpoint/create", - "api-reference/endpoint/delete" - ] - } - ], - "footerSocials": { - "x": "https://x.com/mintlify", - "github": "https://github.com/mintlify", - "linkedin": "https://www.linkedin.com/company/mintsearch" - } -} \ No newline at end of file + "navigation": [ + { + "group": "Get Started", + "pages": ["get-started/introduction", "get-started/quickstart", "get-started/faq"] + }, + { + "group": "Use cases", + "pages": [ + "use-cases/introduction", + "use-cases/chatbots", + "use-cases/question-answering", + "use-cases/semantic-search" + ] + }, + { + "group": "Components", + "pages": [ + "components/introduction", + { + "group": "🗂️ Data sources", + "pages": [ + "components/data-sources/overview", + { + "group": "Built in", + "pages": [ + "components/data-sources/pdf", + "components/data-sources/csv", + "components/data-sources/json", + "components/data-sources/text", + "components/data-sources/web-page", + "components/data-sources/youtube-video", + "components/data-sources/youtube-channel", + "components/data-sources/youtube-search", + "components/data-sources/docx", + "components/data-sources/ppt", + "components/data-sources/excel", + "components/data-sources/sitemap", + "components/data-sources/directory", + "components/data-sources/custom" + ] + } + ] + }, + { + "group": "🗄️ Vector databases", + "pages": [ + "components/vector-databases/overview", + { + "group": "Built in", + "pages": [ + "components/vector-databases/lancedb", + "components/vector-databases/mongodb", + "components/vector-databases/pinecone", + "components/vector-databases/hnswlib", + "components/vector-databases/astradb", + "components/vector-databases/qdrant", + "components/vector-databases/weaviate" + ] + } + ] + }, + { + "group": "🤖 Large language models", + "pages": [ + "components/llms/overview", + { + "group": "Built in", + "pages": [ + "components/llms/anthropic", + "components/llms/openai", + "components/llms/azure-openai", + "components/llms/huggingface", + "components/llms/mistral", + "components/llms/ollama", + "components/llms/vertexai" + ] + } + ] + }, + { + "group": "🧩 Embedding models", + "pages": [ + "components/embeddings/overview", + { + "group": "Built in", + "pages": [ + "components/embeddings/openai", + "components/embeddings/azure-openai", + "components/embeddings/cohere", + "components/embeddings/ollama", + "components/embeddings/vertexai" + ] + } + ] + }, + { + "group": "⚡ Caches", + "pages": [ + "components/caches/overview", + { + "group": "Built in", + "pages": ["components/caches/lmdb", "components/caches/mongodb", "components/caches/redis"] + } + ] + } + ] + }, + { + "group": "Integrations", + "pages": ["integration/langsmith"] + }, + { + "group": "Chatbots", + "pages": ["examples/slack_bot"] + }, + { + "group": "API Reference", + "pages": [ + "api-reference/overview", + { + "group": "RAGApplication methods", + "pages": [ + "api-reference/methods/query", + "api-reference/methods/search", + "api-reference/methods/add-loader", + "api-reference/methods/get-loaders", + "api-reference/methods/delete-loader", + "api-reference/methods/reset" + ] + } + ] + }, + { + "group": "Contributing", + "pages": ["contribution/guidelines", "contribution/dev", "contribution/docs"] + }, + { + "group": "Product", + "pages": ["product/release-notes"] + } + ], + "footerSocials": { + "website": "https://ragkit.ai", + "github": "https://github.com/llm-tools/embedJs", + "linkedin": "https://www.linkedin.com/in/adhityan/" + }, + "isWhiteLabeled": true, + "feedback": { + "suggestEdit": true, + "raiseIssue": true, + "thumbsRating": true + }, + "search": { + "prompt": "✨ Search embedJs docs..." + }, + "redirects": [ + { + "source": "/changelog/command-line", + "destination": "/get-started/introduction" + } + ] +} diff --git a/docs/product/release-notes.mdx b/docs/product/release-notes.mdx new file mode 100644 index 00000000..974fc382 --- /dev/null +++ b/docs/product/release-notes.mdx @@ -0,0 +1,4 @@ +--- +title: ' 📜 Release Notes' +url: https://github.com/llm-tools/embedJs/releases +--- diff --git a/docs/quickstart.mdx b/docs/quickstart.mdx deleted file mode 100644 index c44cfaaf..00000000 --- a/docs/quickstart.mdx +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: 'Quickstart' -description: 'Start building awesome documentation in under 5 minutes' ---- - -## Setup your development - -Learn how to update your docs locally and deploy them to the public. - -### Edit and preview - - - - During the onboarding process, we created a repository on your Github with - your docs content. You can find this repository on our - [dashboard](https://dashboard.mintlify.com). To clone the repository - locally, follow these - [instructions](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) - in your terminal. - - - Previewing helps you make sure your changes look as intended. We built a - command line interface to render these changes locally. 1. Install the - [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the - documentation changes locally with this command: ``` npm i -g mintlify ``` - 2. Run the following command at the root of your documentation (where - `mint.json` is): ``` mintlify dev ``` - - - -### Deploy your changes - - - - - Our Github app automatically deploys your changes to your docs site, so you - don't need to manage deployments yourself. You can find the link to install on - your [dashboard](https://dashboard.mintlify.com). Once the bot has been - successfully installed, there should be a check mark next to the commit hash - of the repo. - - - [Commit and push your changes to - Git](https://docs.github.com/en/get-started/using-git/pushing-commits-to-a-remote-repository#about-git-push) - for your changes to update in your docs site. If you push and don't see that - the Github app successfully deployed your changes, you can also manually - update your docs through our [dashboard](https://dashboard.mintlify.com). - - - - -## Update your docs - -Add content directly in your files with MDX syntax and React components. You can use any of our components, or even build your own. - - - - - Add flair to your docs with personalized branding. - - - - Implement your OpenAPI spec and enable API user interaction. - - - - Draw insights from user interactions with your documentation. - - - - Keep your docs on your own website's subdomain. - - - diff --git a/docs/snippets/snippet-intro.mdx b/docs/snippets/snippet-intro.mdx deleted file mode 100644 index c57e7c75..00000000 --- a/docs/snippets/snippet-intro.mdx +++ /dev/null @@ -1,4 +0,0 @@ -One of the core principles of software development is DRY (Don't Repeat -Yourself). This is a principle that apply to documentation as -well. If you find yourself repeating the same content in multiple places, you -should consider creating a custom snippet to keep your content in sync. diff --git a/docs/use-cases/chatbots.mdx b/docs/use-cases/chatbots.mdx new file mode 100644 index 00000000..3b203be2 --- /dev/null +++ b/docs/use-cases/chatbots.mdx @@ -0,0 +1,23 @@ +--- +title: '🤖 Chatbots' +--- + +Chatbots, especially those powered by Large Language Models (LLMs), have a wide range of use cases, significantly enhancing various aspects of business, education, and personal assistance. Here are some key applications: + +- **Customer Service**: Automating responses to common queries and providing 24/7 support. +- **Education**: Offering personalized tutoring and learning assistance. +- **E-commerce**: Assisting in product discovery, recommendations, and transactions. +- **Content Management**: Aiding in writing, summarizing, and organizing content. +- **Data Analysis**: Extracting insights from large datasets. +- **Language Translation**: Providing real-time multilingual support. +- **Mental Health**: Offering preliminary mental health support and conversation. +- **Entertainment**: Engaging users with games, quizzes, and humorous chats. +- **Accessibility Aid**: Enhancing information and service access for individuals with disabilities. + +EmbedJs provides the right set of tools to create chatbots for the above use cases. Refer to the following examples of chatbots on and you can built on top of these examples: + + + + Enhance your Slack workspace with a specialized bot. + + diff --git a/docs/use-cases/introduction.mdx b/docs/use-cases/introduction.mdx new file mode 100644 index 00000000..a6e023c9 --- /dev/null +++ b/docs/use-cases/introduction.mdx @@ -0,0 +1,11 @@ +--- +title: 🧱 Introduction +--- + +## Overview + +You can use EmbedJs to create the following usecases: + +* [Chatbots](/use-cases/chatbots) +* [Question Answering](/use-cases/question-answering) +* [Semantic Search](/use-cases/semantic-search) diff --git a/docs/use-cases/question-answering.mdx b/docs/use-cases/question-answering.mdx new file mode 100644 index 00000000..c25656b1 --- /dev/null +++ b/docs/use-cases/question-answering.mdx @@ -0,0 +1,72 @@ +--- +title: '❓ Question Answering' +--- + +Utilizing large language models (LLMs) for question answering is a transformative application, bringing significant benefits to various real-world situations. EmbedJs extensively supports tasks related to question answering, including summarization, content creation, language translation, and data analysis. The versatility of question answering with LLMs enables solutions for numerous practical applications such as: + +- **Educational Aid**: Enhancing learning experiences and aiding with homework +- **Customer Support**: Addressing and resolving customer queries efficiently +- **Research Assistance**: Facilitating academic and professional research endeavors +- **Healthcare Information**: Providing fundamental medical knowledge +- **Technical Support**: Resolving technology-related inquiries +- **Legal Information**: Offering basic legal advice and information +- **Business Insights**: Delivering market analysis and strategic business advice +- **Language Learning** Assistance: Aiding in understanding and translating languages +- **Travel Guidance**: Supplying information on travel and hospitality +- **Content Development**: Assisting authors and creators with research and idea generation + +## Example: Build a Q&A System with EmbedJs for Next.JS + +Quickly create a RAG pipeline to answer queries about the [Next.JS Framework](https://nextjs.org/) using EmbedJs tools. + +### Step 1: Set Up Your RAG Pipeline + +First, let's create your RAG pipeline. Open your NodeJs application and add the following code: + +```ts Create pipeline +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); +``` + +This initializes your application. + +### Step 2: Populate Your Pipeline with Data + +Now, let's add data to your pipeline. We'll include the Next.JS website and its documentation: + +```ts Ingest data sources +import { SitemapLoader } from '@llm-tools/embedjs-loader-sitemap'; + +//Add Next.JS Website and docs +app.addLoader(new SitemapLoader({ url: "https://nextjs.org/sitemap.xml" })) + +//Add Next.JS Forum data +app.addLoader(new SitemapLoader({ url: "https://nextjs-forum.com/sitemap.xml" })) +``` + +This step incorporates over **15K pages** from the Next.JS website and forum into your pipeline. For more data source options, check the [EmbedJs data sources overview](/components/data-sources/overview). + +### Step 3: Local Testing of Your Pipeline + +Test the pipeline on your local machine: + +```ts Query App +app.query("Summarize the features of Next.js 14?") +``` + +Run this query to see how your pipeline responds with information about Next.js 14. + +## Need help? + +If you are looking to configure the RAG pipeline further, feel free to checkout the [API reference](/api-reference/pipeline/query). + +In case you run into issues, feel free to contact us via any of the following methods: + + diff --git a/docs/use-cases/semantic-search.mdx b/docs/use-cases/semantic-search.mdx new file mode 100644 index 00000000..04c6e500 --- /dev/null +++ b/docs/use-cases/semantic-search.mdx @@ -0,0 +1,104 @@ +--- +title: '🔍 Semantic Search' +--- + +Semantic searching, which involves understanding the intent and contextual meaning behind search queries, is yet another popular use-case of RAG. It has several popular use cases across various domains: + +- **Information Retrieval**: Enhances search accuracy in databases and websites +- **E-commerce**: Improves product discovery in online shopping +- **Customer Support**: Powers smarter chatbots for effective responses +- **Content Discovery**: Aids in finding relevant media content +- **Knowledge Management**: Streamlines document and data retrieval in enterprises +- **Healthcare**: Facilitates medical research and literature search +- **Legal Research**: Assists in legal document and case law search +- **Academic Research**: Aids in academic paper discovery +- **Language Processing**: Enables multilingual search capabilities + +EmbedJs offers a simple yet customizable `search()` API that you can use for semantic search. See the example in the next section to know more. + +## Example: Semantic Search over Next.JS Website + Forum + +### Step 1: Set Up Your RAG Pipeline + +First, let's create your RAG pipeline. Open your NodeJs application and add the following code: + +```ts Create pipeline +import { RAGApplicationBuilder } from '@llm-tools/embedjs'; +import { OpenAi3SmallEmbeddings } from '@llm-tools/embedjs-openai'; +import { HNSWDb } from '@llm-tools/embedjs-hnswlib'; + +const app = await new RAGApplicationBuilder() +.setModel(SIMPLE_MODELS.OPENAI_GPT4_O) +.setEmbeddingModel(new OpenAi3SmallEmbeddings()) +.setVectorDb(new HNSWDb()) +.build(); +``` + +This initializes your application. + +### Step 2: Populate Your Pipeline with Data + +Now, let's add data to your pipeline. We'll include the Next.JS website and its documentation: + +```ts Ingest data sources +import { SitemapLoader } from '@llm-tools/embedjs-loader-sitemap'; + +//Add Next.JS Website and docs +app.addLoader(new SitemapLoader({ url: "https://nextjs.org/sitemap.xml" })) + +//Add Next.JS Forum data +app.addLoader(new SitemapLoader({ url: "https://nextjs-forum.com/sitemap.xml" })) +``` + +This step incorporates over **15K pages** from the Next.JS website and forum into your pipeline. For more data source options, check the [EmbedJs data sources overview](/components/data-sources/overview). + +### Step 3: Local Testing of Your Pipeline + +Test the pipeline on your local machine: + +```ts Search App +app.search("Summarize the features of Next.js 14?") +/*[ + { + 'score': 0.99, + 'pageContent': 'Next.js 14 | Next.jsBack to BlogThursday, October 26th 2023Next.js 14Posted byLee Robinson@leeerobTim Neutkens@timneutkensAs we announced at Next.js Conf, Next.js 14 is our most focused release with: Turbopack: 5,000 tests passing for App & Pages Router 53% faster local server startup 94% faster code updates with Fast Refresh Server Actions (Stable): Progressively enhanced mutations Integrated with caching & revalidating Simple function calls, or works natively with forms Partial Prerendering', + 'metadata': { + 'id': '6c8d1a7b-ea34-4927-8823-daa29dcfc5af', + 'uniqueLoaderId': '6c8d1a7b-ea34-4927-8823-xba29dcfc5ac', + 'source': 'https://nextjs.org/blog/next-14' + } + }, + { + 'score': 0.98, + 'pageContent': 'Next.js 13.3 | Next.jsBack to BlogThursday, April 6th 2023Next.js 13.3Posted byDelba de Oliveira@delba_oliveiraTim Neutkens@timneutkensNext.js 13.3 adds popular community-requested features, including: File-Based Metadata API: Dynamically generate sitemaps, robots, favicons, and more. Dynamic Open Graph Images: Generate OG images using JSX, HTML, and CSS. Static Export for App Router: Static / Single-Page Application (SPA) support for Server Components. Parallel Routes and Interception: Advanced', + 'metadata': { + 'id': '6c8d1a7b-ea34-4927-8823-daa29dcfc5a1', + 'uniqueLoaderId': '6c8d1a7b-ea34-4927-8823-xba29dcfc5ae', + 'source': 'https://nextjs.org/blog/next-13-3' + } + }, + { + 'score': 0.98, + 'pageContent': 'Upgrading: Version 14 | Next.js MenuUsing App RouterFeatures available in /appApp Router.UpgradingVersion 14Version 14 Upgrading from 13 to 14 To update to Next.js version 14, run the following command using your preferred package manager: Terminalnpm i next@latest react@latest react-dom@latest eslint-config-next@latest Terminalyarn add next@latest react@latest react-dom@latest eslint-config-next@latest Terminalpnpm up next react react-dom eslint-config-next -latest Terminalbun add next@latest', + 'metadata': { + 'id': '6c8d1a7b-ea34-4927-8823-daa29dcfc5a2', + 'uniqueLoaderId': '6c8d1a7b-ea34-4927-8823-xba29dcfc5ad', + 'source': 'https://nextjs.org/docs/app/building-your-application/upgrading/version-14' + } + } +]*/ +``` +The `source` key contains the url of the document that yielded that document chunk. + +If you are interested in configuring the search further, refer to our [API documentation](/api-reference/pipeline/search). + +---- + +This guide will help you swiftly set up a semantic search pipeline with EmbedJs, making it easier to access and analyze specific information from large data sources. + + +## Need help? + +In case you run into issues, feel free to contact us via any of the following methods: + + diff --git a/package-lock.json b/package-lock.json index bf712531..22255318 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,11 +47,11 @@ }, "core/embedjs": { "name": "@llm-tools/embedjs", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", - "@llm-tools/embedjs-utils": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", + "@llm-tools/embedjs-utils": "0.1.3", "axios": "^1.7.7", "debug": "^4.3.7", "langchain": "^0.3.2", @@ -67,7 +67,7 @@ }, "core/embedjs-interfaces": { "name": "@llm-tools/embedjs-interfaces", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "debug": "^4.3.7", @@ -83,87 +83,87 @@ }, "core/embedjs-utils": { "name": "@llm-tools/embedjs-utils", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2" + "@llm-tools/embedjs-interfaces": "0.1.3" } }, "databases/embedjs-astra": { "name": "@llm-tools/embedjs-astradb", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@datastax/astra-db-ts": "^1.5.0", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7" } }, "databases/embedjs-cosmos": { "name": "@llm-tools/embedjs-cosmos", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@azure/cosmos": "^4.1.1", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7" } }, "databases/embedjs-hnswlib": { "name": "@llm-tools/embedjs-hnswlib", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7", "hnswlib-node": "^3.0.0" } }, "databases/embedjs-lancedb": { "name": "@llm-tools/embedjs-lancedb", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@lancedb/lancedb": "^0.10.0", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "compute-cosine-similarity": "^1.1.0" } }, "databases/embedjs-lmdb": { "name": "@llm-tools/embedjs-lmdb", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "lmdb": "^3.1.3" } }, "databases/embedjs-mongodb": { "name": "@llm-tools/embedjs-mongodb", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7", "mongodb": "^6.9.0" } }, "databases/embedjs-pinecone": { "name": "@llm-tools/embedjs-pinecone", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "@pinecone-database/pinecone": "^3.0.3", "debug": "^4.3.7" } }, "databases/embedjs-qdrant": { "name": "@llm-tools/embedjs-qdrant", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "@qdrant/js-client-rest": "^1.11.0", "debug": "^4.3.7", "uuid": "^10.0.0" @@ -171,19 +171,19 @@ }, "databases/embedjs-redis": { "name": "@llm-tools/embedjs-redis", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "ioredis": "^5.4.1" } }, "databases/embedjs-weaviate": { "name": "@llm-tools/embedjs-weaviate", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "compute-cosine-similarity": "^1.1.0", "debug": "^4.3.7", "weaviate-ts-client": "^2.2.0" @@ -191,11 +191,11 @@ }, "loaders/embedjs-loader-confluence": { "name": "@llm-tools/embedjs-loader-confluence", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", - "@llm-tools/embedjs-loader-web": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", + "@llm-tools/embedjs-loader-web": "0.1.3", "confluence.js": "^1.7.4", "debug": "^4.3.7", "md5": "^2.3.0" @@ -203,11 +203,11 @@ }, "loaders/embedjs-loader-csv": { "name": "@llm-tools/embedjs-loader-csv", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", - "@llm-tools/embedjs-utils": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", + "@llm-tools/embedjs-utils": "0.1.3", "axios": "^1.7.7", "csv-parse": "^5.5.6", "debug": "^4.3.7", @@ -216,11 +216,11 @@ }, "loaders/embedjs-loader-msoffice": { "name": "@llm-tools/embedjs-loader-msoffice", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", - "@llm-tools/embedjs-utils": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", + "@llm-tools/embedjs-utils": "0.1.3", "langchain": "^0.3.2", "md5": "^2.3.0", "office-text-extractor": "^3.0.3" @@ -228,11 +228,11 @@ }, "loaders/embedjs-loader-pdf": { "name": "@llm-tools/embedjs-loader-pdf", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", - "@llm-tools/embedjs-utils": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", + "@llm-tools/embedjs-utils": "0.1.3", "langchain": "^0.3.2", "md5": "^2.3.0", "office-text-extractor": "^3.0.3" @@ -240,11 +240,11 @@ }, "loaders/embedjs-loader-sitemap": { "name": "@llm-tools/embedjs-loader-sitemap", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", - "@llm-tools/embedjs-loader-web": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", + "@llm-tools/embedjs-loader-web": "0.1.3", "debug": "^4.3.7", "md5": "^2.3.0", "sitemapper": "^3.2.12" @@ -252,11 +252,11 @@ }, "loaders/embedjs-loader-web": { "name": "@llm-tools/embedjs-loader-web", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", - "@llm-tools/embedjs-utils": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", + "@llm-tools/embedjs-utils": "0.1.3", "axios": "^1.7.7", "debug": "^4.3.7", "html-to-text": "^9.0.5", @@ -269,11 +269,11 @@ }, "loaders/embedjs-loader-youtube": { "name": "@llm-tools/embedjs-loader-youtube", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { - "@llm-tools/embedjs-interfaces": "0.1.2", - "@llm-tools/embedjs-utils": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", + "@llm-tools/embedjs-utils": "0.1.3", "debug": "^4.3.7", "md5": "^2.3.0", "usetube": "^2.2.7", @@ -285,33 +285,33 @@ }, "models/embedjs-anthropic": { "name": "@llm-tools/embedjs-anthropic", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@langchain/anthropic": "^0.3.3", "@langchain/core": "^0.3.6", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7" } }, "models/embedjs-cohere": { "name": "@llm-tools/embedjs-cohere", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@langchain/cohere": "^0.3.0", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "cohere-ai": "^7.14.0" } }, "models/embedjs-huggingface": { "name": "@llm-tools/embedjs-huggingface", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@huggingface/inference": "^2.8.1", "@langchain/community": "^0.3.4", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7" } }, @@ -831,45 +831,45 @@ }, "models/embedjs-mistral": { "name": "@llm-tools/embedjs-mistral", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@langchain/core": "^0.3.6", "@langchain/mistralai": "^0.1.1", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7" } }, "models/embedjs-ollama": { "name": "@llm-tools/embedjs-ollama", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@langchain/core": "^0.3.6", "@langchain/ollama": "^0.1.0", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7" } }, "models/embedjs-openai": { "name": "@llm-tools/embedjs-openai", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@langchain/core": "^0.3.6", "@langchain/openai": "^0.3.5", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7" } }, "models/embedjs-vertexai": { "name": "@llm-tools/embedjs-vertexai", - "version": "0.1.2", + "version": "0.1.3", "license": "Apache-2.0", "dependencies": { "@langchain/core": "^0.3.6", "@langchain/google-vertexai": "^0.1.0", - "@llm-tools/embedjs-interfaces": "0.1.2", + "@llm-tools/embedjs-interfaces": "0.1.3", "debug": "^4.3.7" } }, @@ -11901,7 +11901,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 4" @@ -16182,7 +16182,6 @@ "version": "5.6.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", - "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", From d772ae03ff61bafeb98706719d421cd7b6f6ba47 Mon Sep 17 00:00:00 2001 From: Adhityan K V Date: Wed, 9 Oct 2024 19:16:30 +0200 Subject: [PATCH 3/3] chore: added github issue templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 33 +++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 +++ .../ISSUE_TEMPLATE/documentation_issue.yml | 11 +++++++ .github/ISSUE_TEMPLATE/feature_request.yml | 23 +++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/documentation_issue.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..c4cc3641 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,33 @@ +name: 🐛 Bug Report +description: Create a report to help us reproduce and fix the bug + +body: + - type: markdown + attributes: + value: > + #### Before submitting a bug, please make sure the issue hasn't been already addressed by searching through [the existing and past issues](https://github.com/llm-tools/embedJs/issues?q=is%3Aissue+sort%3Acreated-desc+). + - type: textarea + attributes: + label: 🐛 Describe the bug + description: | + Please provide a clear and concise description of what the bug is. + + If relevant, add a minimal example so that we can reproduce the error by running the code. It is very important for the snippet to be as succinct (minimal) as possible, so please take time to trim down any irrelevant code to help us debug efficiently. We are going to copy-paste your code and we expect to get the same result as you did: avoid any external data, and include the relevant imports, etc. + + Please also paste or describe the results you observe instead of the expected results. If you observe an error, please paste the error message including the **full** traceback of the exception. It may be relevant to wrap error messages in ```` ```triple quotes blocks``` ````. + placeholder: | + A clear and concise description of what the bug is. + + ```ts + Sample code to reproduce the problem + ``` + + ``` + The error message you got, with the full traceback. + ```` + validations: + required: true + - type: markdown + attributes: + value: > + Thanks for contributing 🎉! diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..407d17fc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: Urgent issue + url: https://www.linkedin.com/in/adhityan + about: If your issue is urgent and needs immidiately attention, please contact the author directly on LinkedIn. diff --git a/.github/ISSUE_TEMPLATE/documentation_issue.yml b/.github/ISSUE_TEMPLATE/documentation_issue.yml new file mode 100644 index 00000000..3a162f2f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation_issue.yml @@ -0,0 +1,11 @@ +name: Documentation +description: Report an issue related to the docs. +title: "DOC: " + +body: + - type: textarea + attributes: + label: 'Issue with current documentation:' + description: > + Please make sure to leave a reference to the document/code you're + referring to. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..1fe30721 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,23 @@ +name: 🚀 Feature request +description: Submit a proposal/request for a new EmbedJs feature + +body: + - type: textarea + id: feature-request + attributes: + label: 🚀 The feature + description: > + A clear and concise description of the feature proposal + validations: + required: true + - type: textarea + attributes: + label: Motivation, pitch + description: > + Please outline the motivation for the proposal. Is your feature request related to a specific problem? e.g., *"I'm working on X and would like Y to be possible"*. If this is related to another GitHub issue, please link here too. + validations: + required: true + - type: markdown + attributes: + value: > + Thanks for contributing 🎉!

-License -NPM Version +