mirror of
https://github.com/run-llama/LlamaIndexTS.git
synced 2026-07-09 11:25:43 -04:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0e980d962d | |||
| 3ed6acc6a6 | |||
| 56746c240f | |||
| 5c1c2c7f5b | |||
| a699086f46 | |||
| 454c204112 | |||
| 277468160d | |||
| a0f424e592 |
@@ -67,3 +67,4 @@ jobs:
|
||||
with:
|
||||
commit_message: "chore: update lock file"
|
||||
branch: changeset-release/main
|
||||
file_pattern: "pnpm-lock.yaml"
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# docs
|
||||
|
||||
## 0.0.43
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.5.2
|
||||
|
||||
## 0.0.42
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 2774681: Add mixedbread's embeddings and reranking API
|
||||
- Updated dependencies [2774681]
|
||||
- Updated dependencies [a0f424e]
|
||||
- llamaindex@0.5.1
|
||||
|
||||
## 0.0.41
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
# MixedbreadAI
|
||||
|
||||
Welcome to the mixedbread embeddings guide! This guide will help you use the mixedbread ai's API to generate embeddings for your text documents, ensuring you get the most relevant information, just like picking the freshest bread from the bakery.
|
||||
|
||||
To find out more about the latest features, updates, and available models, visit [mixedbread.ai](https://mixedbread-ai.com/).
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Setup](#setup)
|
||||
2. [Usage with LlamaIndex](#integration-with-llamaindex)
|
||||
3. [Embeddings with Custom Parameters](#embeddings-with-custom-parameters)
|
||||
|
||||
## Setup
|
||||
|
||||
First, you will need to install the `llamaindex` package.
|
||||
|
||||
```bash
|
||||
pnpm install llamaindex
|
||||
```
|
||||
|
||||
Next, sign up for an API key at [mixedbread.ai](https://mixedbread.ai/). Once you have your API key, you can import the necessary modules and create a new instance of the `MixedbreadAIEmbeddings` class.
|
||||
|
||||
```ts
|
||||
import { MixedbreadAIEmbeddings, Document, Settings } from "llamaindex";
|
||||
```
|
||||
|
||||
## Usage with LlamaIndex
|
||||
|
||||
This section will guide you through integrating mixedbread embeddings with LlamaIndex for more advanced usage.
|
||||
|
||||
### Step 1: Load and Index Documents
|
||||
|
||||
For this example, we will use a single document. In a real-world scenario, you would have multiple documents to index, like a variety of breads in a bakery.
|
||||
|
||||
```ts
|
||||
Settings.embedModel = new MixedbreadAIEmbeddings({
|
||||
apiKey: "<MIXEDBREAD_API_KEY>",
|
||||
model: "mixedbread-ai/mxbai-embed-large-v1",
|
||||
});
|
||||
|
||||
const document = new Document({
|
||||
text: "The true source of happiness.",
|
||||
id_: "bread",
|
||||
});
|
||||
|
||||
const index = await VectorStoreIndex.fromDocuments([document]);
|
||||
```
|
||||
|
||||
### Step 2: Create a Query Engine
|
||||
|
||||
Combine the retriever and the embed model to create a query engine. This setup ensures that your queries are processed to provide the best results, like arranging the bread in the order of freshness and quality.
|
||||
|
||||
Models can require prompts to generate embeddings for queries, in the 'mixedbread-ai/mxbai-embed-large-v1' model's case, the prompt is `Represent this sentence for searching relevant passages:`.
|
||||
|
||||
```ts
|
||||
const queryEngine = index.asQueryEngine();
|
||||
|
||||
const query =
|
||||
"Represent this sentence for searching relevant passages: What is bread?";
|
||||
|
||||
// Log the response
|
||||
const results = await queryEngine.query(query);
|
||||
console.log(results); // Serving up the freshest, most relevant results.
|
||||
```
|
||||
|
||||
## Embeddings with Custom Parameters
|
||||
|
||||
This section will guide you through generating embeddings with custom parameters and usage with f.e. matryoshka and binary embeddings.
|
||||
|
||||
### Step 1: Create an Instance of MixedbreadAIEmbeddings
|
||||
|
||||
Create a new instance of the `MixedbreadAIEmbeddings` class with custom parameters. For example, to use the `mixedbread-ai/mxbai-embed-large-v1` model with a batch size of 64, normalized embeddings, and binary encoding format:
|
||||
|
||||
```ts
|
||||
const embeddings = new MixedbreadAIEmbeddings({
|
||||
apiKey: "<MIXEDBREAD_API_KEY>",
|
||||
model: "mixedbread-ai/mxbai-embed-large-v1",
|
||||
batchSize: 64,
|
||||
normalized: true,
|
||||
dimensions: 512,
|
||||
encodingFormat: MixedbreadAI.EncodingFormat.Binary,
|
||||
});
|
||||
```
|
||||
|
||||
### Step 2: Define Texts
|
||||
|
||||
Define the texts you want to generate embeddings for.
|
||||
|
||||
```ts
|
||||
const texts = ["Bread is life", "Bread is love"];
|
||||
```
|
||||
|
||||
### Step 3: Generate Embeddings
|
||||
|
||||
Use the `embedDocuments` method to generate embeddings for the texts.
|
||||
|
||||
```ts
|
||||
const result = await embeddings.embedDocuments(texts);
|
||||
console.log(result); // Perfectly customized embeddings, ready to serve.
|
||||
```
|
||||
@@ -0,0 +1,164 @@
|
||||
# MixedbreadAI
|
||||
|
||||
Welcome to the mixedbread ai reranker guide! This guide will help you use mixedbread ai's API to rerank search query results, ensuring you get the most relevant information, just like picking the freshest bread from the bakery.
|
||||
|
||||
To find out more about the latest features and updates, visit the [mixedbread.ai](https://mixedbread.ai/).
|
||||
|
||||
## Table of Contents
|
||||
|
||||
1. [Setup](#setup)
|
||||
2. [Usage with LlamaIndex](#integration-with-llamaindex)
|
||||
3. [Simple Reranking Guide](#simple-reranking-guide)
|
||||
4. [Reranking with Objects](#reranking-with-objects)
|
||||
|
||||
## Setup
|
||||
|
||||
First, you will need to install the `llamaindex` package.
|
||||
|
||||
```bash
|
||||
pnpm install llamaindex
|
||||
```
|
||||
|
||||
Next, sign up for an API key at [mixedbread.ai](https://mixedbread.ai/). Once you have your API key, you can import the necessary modules and create a new instance of the `MixedbreadAIReranker` class.
|
||||
|
||||
```ts
|
||||
import {
|
||||
MixedbreadAIReranker,
|
||||
Document,
|
||||
OpenAI,
|
||||
VectorStoreIndex,
|
||||
Settings,
|
||||
} from "llamaindex";
|
||||
```
|
||||
|
||||
## Usage with LlamaIndex
|
||||
|
||||
This section will guide you through integrating mixedbread's reranker with LlamaIndex.
|
||||
|
||||
### Step 1: Load and Index Documents
|
||||
|
||||
For this example, we will use a single document. In a real-world scenario, you would have multiple documents to index, like a variety of breads in a bakery.
|
||||
|
||||
```ts
|
||||
const document = new Document({
|
||||
text: "This is a sample document.",
|
||||
id_: "sampleDoc",
|
||||
});
|
||||
|
||||
Settings.llm = new OpenAI({ model: "gpt-3.5-turbo", temperature: 0.1 });
|
||||
|
||||
const index = await VectorStoreIndex.fromDocuments([document]);
|
||||
```
|
||||
|
||||
### Step 2: Increase Similarity TopK
|
||||
|
||||
The default value for `similarityTopK` is 2, which means only the most similar document will be returned. To get more results, like picking a variety of fresh breads, you can increase the value of `similarityTopK`.
|
||||
|
||||
```ts
|
||||
const retriever = index.asRetriever();
|
||||
retriever.similarityTopK = 5;
|
||||
```
|
||||
|
||||
### Step 3: Create a MixedbreadAIReranker Instance
|
||||
|
||||
Create a new instance of the `MixedbreadAIReranker` class.
|
||||
|
||||
```ts
|
||||
const nodePostprocessor = new MixedbreadAIReranker({
|
||||
apiKey: "<MIXEDBREAD_API_KEY>",
|
||||
topN: 4,
|
||||
});
|
||||
```
|
||||
|
||||
### Step 4: Create a Query Engine
|
||||
|
||||
Combine the retriever and node postprocessor to create a query engine. This setup ensures that your queries are processed and reranked to provide the best results, like arranging the bread in the order of freshness and quality.
|
||||
|
||||
```ts
|
||||
const queryEngine = index.asQueryEngine({
|
||||
retriever,
|
||||
nodePostprocessors: [nodePostprocessor],
|
||||
});
|
||||
|
||||
// Log the response
|
||||
const response = await queryEngine.query("Where did the author grow up?");
|
||||
console.log(response);
|
||||
```
|
||||
|
||||
With mixedbread's Reranker, you're all set to serve up the most relevant and well-ordered results, just like a skilled baker arranging their best breads for eager customers. Enjoy the perfect blend of technology and culinary delight!
|
||||
|
||||
## Simple Reranking Guide
|
||||
|
||||
This section will guide you through a simple reranking process using mixedbread ai.
|
||||
|
||||
### Step 1: Create an Instance of MixedbreadAIReranker
|
||||
|
||||
Create a new instance of the `MixedbreadAIReranker` class, passing in your API key and the number of results you want to return. It's like setting up your bakery to offer a specific number of freshly baked items.
|
||||
|
||||
```ts
|
||||
const reranker = new MixedbreadAIReranker({
|
||||
apiKey: "<MIXEDBREAD_API_KEY>",
|
||||
topN: 4,
|
||||
});
|
||||
```
|
||||
|
||||
### Step 2: Define Nodes and Query
|
||||
|
||||
Define the nodes (documents) you want to rerank and the query.
|
||||
|
||||
```ts
|
||||
const nodes = [
|
||||
{ node: new BaseNode("To bake bread you need flour") },
|
||||
{ node: new BaseNode("To bake bread you need yeast") },
|
||||
];
|
||||
const query = "What do you need to bake bread?";
|
||||
```
|
||||
|
||||
### Step 3: Perform Reranking
|
||||
|
||||
Use the `postprocessNodes` method to rerank the nodes based on the query.
|
||||
|
||||
```ts
|
||||
const result = await reranker.postprocessNodes(nodes, query);
|
||||
console.log(result); // Like pulling freshly baked nodes out of the oven.
|
||||
```
|
||||
|
||||
## Reranking with Objects
|
||||
|
||||
This section will guide you through reranking when working with objects.
|
||||
|
||||
### Step 1: Create an Instance of MixedbreadAIReranker
|
||||
|
||||
Create a new instance of the `MixedbreadAIReranker` class, just like before.
|
||||
|
||||
```ts
|
||||
const reranker = new MixedbreadAIReranker({
|
||||
apiKey: "<MIXEDBREAD_API_KEY>",
|
||||
model: "mixedbread-ai/mxbai-rerank-large-v1",
|
||||
topK: 5,
|
||||
rankFields: ["title", "content"],
|
||||
returnInput: true,
|
||||
maxRetries: 5,
|
||||
});
|
||||
```
|
||||
|
||||
### Step 2: Define Documents and Query
|
||||
|
||||
Define the documents (objects) you want to rerank and the query.
|
||||
|
||||
```ts
|
||||
const documents = [
|
||||
{ title: "Bread Recipe", content: "To bake bread you need flour" },
|
||||
{ title: "Bread Recipe", content: "To bake bread you need yeast" },
|
||||
];
|
||||
const query = "What do you need to bake bread?";
|
||||
```
|
||||
|
||||
### Step 3: Perform Reranking
|
||||
|
||||
Use the `rerank` method to reorder the documents based on the query.
|
||||
|
||||
```ts
|
||||
const result = await reranker.rerank(documents, query);
|
||||
console.log(result); // Perfectly customized results, ready to serve.
|
||||
```
|
||||
+18
-18
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "docs",
|
||||
"version": "0.0.41",
|
||||
"version": "0.0.43",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"docusaurus": "docusaurus",
|
||||
@@ -15,28 +15,28 @@
|
||||
"typecheck": "tsc"
|
||||
},
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "^3.3.2",
|
||||
"@docusaurus/remark-plugin-npm2yarn": "^3.3.2",
|
||||
"@docusaurus/core": "3.4.0",
|
||||
"@docusaurus/remark-plugin-npm2yarn": "3.4.0",
|
||||
"@llamaindex/examples": "workspace:*",
|
||||
"@mdx-js/react": "^3.0.1",
|
||||
"clsx": "^2.1.1",
|
||||
"@mdx-js/react": "3.0.1",
|
||||
"clsx": "2.1.1",
|
||||
"llamaindex": "workspace:*",
|
||||
"postcss": "^8.4.38",
|
||||
"prism-react-renderer": "^2.3.1",
|
||||
"raw-loader": "^4.0.2",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1"
|
||||
"postcss": "8.4.39",
|
||||
"prism-react-renderer": "2.3.1",
|
||||
"raw-loader": "4.0.2",
|
||||
"react": "18.3.1",
|
||||
"react-dom": "18.3.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "3.3.2",
|
||||
"@docusaurus/preset-classic": "^3.3.2",
|
||||
"@docusaurus/theme-classic": "^3.3.2",
|
||||
"@docusaurus/types": "^3.3.2",
|
||||
"@tsconfig/docusaurus": "^2.0.3",
|
||||
"@docusaurus/module-type-aliases": "3.4.0",
|
||||
"@docusaurus/preset-classic": "3.4.0",
|
||||
"@docusaurus/theme-classic": "3.4.0",
|
||||
"@docusaurus/types": "3.4.0",
|
||||
"@tsconfig/docusaurus": "2.0.3",
|
||||
"@types/node": "^20.12.11",
|
||||
"docusaurus-plugin-typedoc": "^1.0.1",
|
||||
"typedoc": "^0.25.13",
|
||||
"typedoc-plugin-markdown": "^4.0.1",
|
||||
"docusaurus-plugin-typedoc": "1.0.2",
|
||||
"typedoc": "0.26.3",
|
||||
"typedoc-plugin-markdown": "4.1.2",
|
||||
"typescript": "^5.5.2"
|
||||
},
|
||||
"browserslist": {
|
||||
|
||||
@@ -1,5 +1,21 @@
|
||||
# @llamaindex/autotool-02-next-example
|
||||
|
||||
## 0.1.27
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.5.2
|
||||
- @llamaindex/autotool@2.0.0
|
||||
|
||||
## 0.1.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2774681]
|
||||
- Updated dependencies [a0f424e]
|
||||
- llamaindex@0.5.1
|
||||
- @llamaindex/autotool@2.0.0
|
||||
|
||||
## 0.1.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/autotool-02-next-example",
|
||||
"private": true,
|
||||
"version": "0.1.25",
|
||||
"version": "0.1.27",
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
"unplugin": "^1.10.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"llamaindex": "^0.5.0",
|
||||
"llamaindex": "^0.5.2",
|
||||
"openai": "^4",
|
||||
"typescript": "^4"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @llamaindex/cloud
|
||||
|
||||
## 0.2.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
- 3ed6acc: feat: cloud api change
|
||||
|
||||
## 0.1.4
|
||||
|
||||
### Patch Changes
|
||||
|
||||
+1225
-8
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/cloud",
|
||||
"version": "0.1.4",
|
||||
"version": "0.2.0",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @llamaindex/community
|
||||
|
||||
## 0.0.20
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 56746c2: fix: llama3 patched to handle empty content (can happen with system) and added max tokens export
|
||||
|
||||
## 0.0.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/community",
|
||||
"description": "Community package for LlamaIndexTS",
|
||||
"version": "0.0.19",
|
||||
"version": "0.0.20",
|
||||
"type": "module",
|
||||
"types": "dist/type/index.d.ts",
|
||||
"main": "dist/cjs/index.js",
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
export { BEDROCK_MODELS, Bedrock } from "./llm/bedrock/base.js";
|
||||
export {
|
||||
BEDROCK_MODELS,
|
||||
BEDROCK_MODEL_MAX_TOKENS,
|
||||
Bedrock,
|
||||
} from "./llm/bedrock/base.js";
|
||||
|
||||
@@ -150,6 +150,18 @@ export type BedrockModelParams = {
|
||||
maxTokens?: number;
|
||||
};
|
||||
|
||||
export const BEDROCK_MODEL_MAX_TOKENS: Partial<Record<BEDROCK_MODELS, number>> =
|
||||
{
|
||||
[BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_SONNET]: 4096,
|
||||
[BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_HAIKU]: 4096,
|
||||
[BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_OPUS]: 4096,
|
||||
[BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_5_SONNET]: 4096,
|
||||
[BEDROCK_MODELS.META_LLAMA2_13B_CHAT]: 2048,
|
||||
[BEDROCK_MODELS.META_LLAMA2_70B_CHAT]: 2048,
|
||||
[BEDROCK_MODELS.META_LLAMA3_8B_INSTRUCT]: 2048,
|
||||
[BEDROCK_MODELS.META_LLAMA3_70B_INSTRUCT]: 2048,
|
||||
};
|
||||
|
||||
const DEFAULT_BEDROCK_PARAMS = {
|
||||
temperature: 0.1,
|
||||
topP: 1,
|
||||
|
||||
@@ -154,10 +154,10 @@ export const mapChatMessagesToMetaMessages = <T extends ChatMessage>(
|
||||
messages: T[],
|
||||
): MetaMessage[] => {
|
||||
return messages.map((msg) => {
|
||||
let content: string;
|
||||
let content: string = "";
|
||||
if (typeof msg.content === "string") {
|
||||
content = msg.content;
|
||||
} else {
|
||||
} else if (msg.content.length) {
|
||||
content = (msg.content[0] as MessageContentTextDetail).text;
|
||||
}
|
||||
return {
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @llamaindex/experimental
|
||||
|
||||
## 0.0.52
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.5.2
|
||||
|
||||
## 0.0.51
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2774681]
|
||||
- Updated dependencies [a0f424e]
|
||||
- llamaindex@0.5.1
|
||||
|
||||
## 0.0.50
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/experimental",
|
||||
"description": "Experimental package for LlamaIndexTS",
|
||||
"version": "0.0.50",
|
||||
"version": "0.0.52",
|
||||
"type": "module",
|
||||
"types": "dist/type/index.d.ts",
|
||||
"main": "dist/cjs/index.js",
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# llamaindex
|
||||
|
||||
## 0.5.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [3ed6acc]
|
||||
- @llamaindex/cloud@0.2.0
|
||||
|
||||
## 0.5.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 2774681: Add mixedbread's embeddings and reranking API
|
||||
- a0f424e: corrected the regex in the react.ts file in extractToolUse & extractJsonStr functions, as mentioned in https://github.com/run-llama/LlamaIndexTS/issues/1019
|
||||
|
||||
## 0.5.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @llamaindex/cloudflare-worker-agent-test
|
||||
|
||||
## 0.0.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.5.2
|
||||
|
||||
## 0.0.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2774681]
|
||||
- Updated dependencies [a0f424e]
|
||||
- llamaindex@0.5.1
|
||||
|
||||
## 0.0.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/cloudflare-worker-agent-test",
|
||||
"version": "0.0.34",
|
||||
"version": "0.0.36",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @llamaindex/next-agent-test
|
||||
|
||||
## 0.1.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.5.2
|
||||
|
||||
## 0.1.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2774681]
|
||||
- Updated dependencies [a0f424e]
|
||||
- llamaindex@0.5.1
|
||||
|
||||
## 0.1.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/next-agent-test",
|
||||
"version": "0.1.34",
|
||||
"version": "0.1.36",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# test-edge-runtime
|
||||
|
||||
## 0.1.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.5.2
|
||||
|
||||
## 0.1.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2774681]
|
||||
- Updated dependencies [a0f424e]
|
||||
- llamaindex@0.5.1
|
||||
|
||||
## 0.1.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/nextjs-edge-runtime-test",
|
||||
"version": "0.1.33",
|
||||
"version": "0.1.35",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @llamaindex/next-node-runtime
|
||||
|
||||
## 0.0.17
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.5.2
|
||||
|
||||
## 0.0.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2774681]
|
||||
- Updated dependencies [a0f424e]
|
||||
- llamaindex@0.5.1
|
||||
|
||||
## 0.0.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/next-node-runtime-test",
|
||||
"version": "0.0.15",
|
||||
"version": "0.0.17",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @llamaindex/waku-query-engine-test
|
||||
|
||||
## 0.0.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.5.2
|
||||
|
||||
## 0.0.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2774681]
|
||||
- Updated dependencies [a0f424e]
|
||||
- llamaindex@0.5.1
|
||||
|
||||
## 0.0.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/waku-query-engine-test",
|
||||
"version": "0.0.34",
|
||||
"version": "0.0.36",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "llamaindex",
|
||||
"version": "0.5.0",
|
||||
"version": "0.5.2",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"keywords": [
|
||||
@@ -45,6 +45,7 @@
|
||||
"chromadb": "1.8.1",
|
||||
"cohere-ai": "7.9.5",
|
||||
"groq-sdk": "^0.5.0",
|
||||
"@mixedbread-ai/sdk": "^2.2.11",
|
||||
"js-tiktoken": "^1.0.12",
|
||||
"lodash": "^4.17.21",
|
||||
"magic-bytes.js": "^1.10.0",
|
||||
|
||||
@@ -66,7 +66,7 @@ function reasonFormatter(reason: Reason): string | Promise<string> {
|
||||
}
|
||||
|
||||
function extractJsonStr(text: string): string {
|
||||
const pattern = /\{.*}/s;
|
||||
const pattern = /\{.*\}/s;
|
||||
const match = text.match(pattern);
|
||||
|
||||
if (!match) {
|
||||
@@ -98,7 +98,7 @@ function extractToolUse(
|
||||
inputText: string,
|
||||
): [thought: string, action: string, input: string] {
|
||||
const pattern =
|
||||
/\s*Thought: (.*?)\nAction: ([a-zA-Z0-9_]+).*?\.*Input: .*?(\{.*?})/s;
|
||||
/\s*Thought: (.*?)\nAction: ([a-zA-Z0-9_]+).*?\.*Input: .*?(\{.*?\})/s;
|
||||
|
||||
const match = inputText.match(pattern);
|
||||
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
import { getEnv } from "@llamaindex/env";
|
||||
import { MixedbreadAI, MixedbreadAIClient } from "@mixedbread-ai/sdk";
|
||||
import { BaseEmbedding, type EmbeddingInfo } from "./types.js";
|
||||
|
||||
type EmbeddingsRequestWithoutInput = Omit<
|
||||
MixedbreadAI.EmbeddingsRequest,
|
||||
"input"
|
||||
>;
|
||||
|
||||
/**
|
||||
* Interface extending EmbeddingsParams with additional
|
||||
* parameters specific to the MixedbreadAIEmbeddings class.
|
||||
*/
|
||||
export interface MixedbreadAIEmbeddingsParams
|
||||
extends Omit<EmbeddingsRequestWithoutInput, "model"> {
|
||||
/**
|
||||
* The model to use for generating embeddings.
|
||||
* @default {"mixedbread-ai/mxbai-embed-large-v1"}
|
||||
*/
|
||||
model?: string;
|
||||
|
||||
/**
|
||||
* The API key to use.
|
||||
* @default {process.env.MXBAI_API_KEY}
|
||||
*/
|
||||
apiKey?: string;
|
||||
|
||||
/**
|
||||
* The base URL for the API.
|
||||
*/
|
||||
baseUrl?: string;
|
||||
|
||||
/**
|
||||
* The maximum number of documents to embed in a single request.
|
||||
* @default {128}
|
||||
*/
|
||||
embedBatchSize?: number;
|
||||
|
||||
/**
|
||||
* The embed info for the model.
|
||||
*/
|
||||
embedInfo?: EmbeddingInfo;
|
||||
|
||||
/**
|
||||
* The maximum number of retries to attempt.
|
||||
* @default {3}
|
||||
*/
|
||||
maxRetries?: number;
|
||||
|
||||
/**
|
||||
* Timeouts for the request.
|
||||
*/
|
||||
timeoutInSeconds?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Class for generating embeddings using the mixedbread ai API.
|
||||
*
|
||||
* This class leverages the model "mixedbread-ai/mxbai-embed-large-v1" to generate
|
||||
* embeddings for text documents. The embeddings can be used for various NLP tasks
|
||||
* such as similarity comparison, clustering, or as features in machine learning models.
|
||||
*
|
||||
* @example
|
||||
* const mxbai = new MixedbreadAIEmbeddings({ apiKey: 'your-api-key' });
|
||||
* const texts = ["Baking bread is fun", "I love baking"];
|
||||
* const result = await mxbai.getTextEmbeddings(texts);
|
||||
* console.log(result);
|
||||
*
|
||||
* @example
|
||||
* const mxbai = new MixedbreadAIEmbeddings({
|
||||
* apiKey: 'your-api-key',
|
||||
* model: 'mixedbread-ai/mxbai-embed-large-v1',
|
||||
* encodingFormat: MixedbreadAI.EncodingFormat.Binary,
|
||||
* dimensions: 512,
|
||||
* normalized: true,
|
||||
* });
|
||||
* const query = "Represent this sentence for searching relevant passages: Is baking bread fun?";
|
||||
* const result = await mxbai.getTextEmbedding(query);
|
||||
* console.log(result);
|
||||
*/
|
||||
export class MixedbreadAIEmbeddings extends BaseEmbedding {
|
||||
requestParams: EmbeddingsRequestWithoutInput;
|
||||
requestOptions: MixedbreadAIClient.RequestOptions;
|
||||
private client: MixedbreadAIClient;
|
||||
|
||||
/**
|
||||
* Constructor for MixedbreadAIEmbeddings.
|
||||
* @param {Partial<MixedbreadAIEmbeddingsParams>} params - An optional object with properties to configure the instance.
|
||||
* @throws {Error} If the API key is not provided or found in the environment variables.
|
||||
* @throws {Error} If the batch size exceeds 256.
|
||||
*/
|
||||
constructor(params?: Partial<MixedbreadAIEmbeddingsParams>) {
|
||||
super();
|
||||
|
||||
const apiKey = params?.apiKey ?? getEnv("MXBAI_API_KEY");
|
||||
if (!apiKey) {
|
||||
throw new Error(
|
||||
"mixedbread ai API key not found. Either provide it in the constructor or set the 'MXBAI_API_KEY' environment variable.",
|
||||
);
|
||||
}
|
||||
if (params?.embedBatchSize && params?.embedBatchSize > 256) {
|
||||
throw new Error(
|
||||
"The maximum batch size for mixedbread ai embeddings API is 256.",
|
||||
);
|
||||
}
|
||||
|
||||
this.embedBatchSize = params?.embedBatchSize ?? 128;
|
||||
this.embedInfo = params?.embedInfo;
|
||||
this.requestParams = {
|
||||
model: params?.model ?? "mixedbread-ai/mxbai-embed-large-v1",
|
||||
normalized: params?.normalized,
|
||||
dimensions: params?.dimensions,
|
||||
encodingFormat: params?.encodingFormat,
|
||||
truncationStrategy: params?.truncationStrategy,
|
||||
prompt: params?.prompt,
|
||||
};
|
||||
this.requestOptions = {
|
||||
timeoutInSeconds: params?.timeoutInSeconds,
|
||||
maxRetries: params?.maxRetries ?? 3,
|
||||
// Support for this already exists in the python sdk and will be added to the js sdk soon
|
||||
// @ts-ignore
|
||||
additionalHeaders: {
|
||||
"user-agent": "@mixedbread-ai/llamaindex-ts-sdk",
|
||||
},
|
||||
};
|
||||
this.client = new MixedbreadAIClient({
|
||||
apiKey,
|
||||
environment: params?.baseUrl,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates an embedding for a single text.
|
||||
* @param {string} text - A string to generate an embedding for.
|
||||
* @returns {Promise<number[]>} A Promise that resolves to an array of numbers representing the embedding.
|
||||
*
|
||||
* @example
|
||||
* const query = "Represent this sentence for searching relevant passages: Is baking bread fun?";
|
||||
* const result = await mxbai.getTextEmbedding(text);
|
||||
* console.log(result);
|
||||
*/
|
||||
async getTextEmbedding(text: string): Promise<number[]> {
|
||||
return (await this.getTextEmbeddings([text]))[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates embeddings for an array of texts.
|
||||
* @param {string[]} texts - An array of strings to generate embeddings for.
|
||||
* @returns {Promise<Array<number[]>>} A Promise that resolves to an array of embeddings.
|
||||
*
|
||||
* @example
|
||||
* const texts = ["Baking bread is fun", "I love baking"];
|
||||
* const result = await mxbai.getTextEmbeddings(texts);
|
||||
* console.log(result);
|
||||
*/
|
||||
async getTextEmbeddings(texts: string[]): Promise<Array<number[]>> {
|
||||
if (texts.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const response = await this.client.embeddings(
|
||||
{
|
||||
...this.requestParams,
|
||||
input: texts,
|
||||
},
|
||||
this.requestOptions,
|
||||
);
|
||||
return response.data.map((d) => d.embedding as number[]);
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ export * from "./GeminiEmbedding.js";
|
||||
export { HuggingFaceInferenceAPIEmbedding } from "./HuggingFaceEmbedding.js";
|
||||
export * from "./JinaAIEmbedding.js";
|
||||
export * from "./MistralAIEmbedding.js";
|
||||
export * from "./MixedbreadAIEmbeddings.js";
|
||||
export * from "./MultiModalEmbedding.js";
|
||||
export { OllamaEmbedding } from "./OllamaEmbedding.js";
|
||||
export * from "./OpenAIEmbedding.js";
|
||||
|
||||
@@ -0,0 +1,203 @@
|
||||
import { getEnv } from "@llamaindex/env";
|
||||
import { MixedbreadAI, MixedbreadAIClient } from "@mixedbread-ai/sdk";
|
||||
|
||||
import { MetadataMode } from "@llamaindex/core/schema";
|
||||
import { extractText } from "@llamaindex/core/utils";
|
||||
|
||||
import type { MessageContent } from "@llamaindex/core/llms";
|
||||
import type { BaseNode, NodeWithScore } from "@llamaindex/core/schema";
|
||||
import type { BaseNodePostprocessor } from "../types.js";
|
||||
|
||||
type RerankingRequestWithoutInput = Omit<
|
||||
MixedbreadAI.RerankingRequest,
|
||||
"query" | "input"
|
||||
>;
|
||||
|
||||
/**
|
||||
* Interface extending RerankingRequestWithoutInput with additional
|
||||
* parameters specific to the MixedbreadRerank class.
|
||||
*/
|
||||
export interface MixedbreadAIRerankerParams
|
||||
extends Omit<RerankingRequestWithoutInput, "model"> {
|
||||
/**
|
||||
* The model to use for reranking. For example "default" or "mixedbread-ai/mxbai-rerank-large-v1".
|
||||
* @default {"default"}
|
||||
*/
|
||||
model?: string;
|
||||
|
||||
/**
|
||||
* The API key to use.
|
||||
* @default {process.env.MXBAI_API_KEY}
|
||||
*/
|
||||
apiKey?: string;
|
||||
|
||||
/**
|
||||
* The base URL of the MixedbreadAI API.
|
||||
*/
|
||||
baseUrl?: string;
|
||||
|
||||
/**
|
||||
* The maximum number of retries to attempt.
|
||||
* @default {3}
|
||||
*/
|
||||
maxRetries?: number;
|
||||
|
||||
/**
|
||||
* Timeouts for the request.
|
||||
*/
|
||||
timeoutInSeconds?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Node postprocessor that uses MixedbreadAI's rerank API.
|
||||
*
|
||||
* This class utilizes MixedbreadAI's rerank model to reorder a set of nodes based on their relevance
|
||||
* to a given query. The reranked nodes are then used for various applications like search results refinement.
|
||||
*
|
||||
* @example
|
||||
* const reranker = new MixedbreadAIReranker({ apiKey: 'your-api-key' });
|
||||
* const nodes = [{ node: new BaseNode('To bake bread you need flour') }, { node: new BaseNode('To bake bread you need yeast') }];
|
||||
* const query = "What do you need to bake bread?";
|
||||
* const result = await reranker.postprocessNodes(nodes, query);
|
||||
* console.log(result);
|
||||
*
|
||||
* @example
|
||||
* const reranker = new MixedbreadAIReranker({
|
||||
* apiKey: 'your-api-key',
|
||||
* model: 'mixedbread-ai/mxbai-rerank-large-v1',
|
||||
* topK: 5,
|
||||
* rankFields: ["title", "content"],
|
||||
* returnInput: true,
|
||||
* maxRetries: 5
|
||||
* });
|
||||
* const documents = [{ title: "Bread Recipe", content: "To bake bread you need flour" }, { title: "Bread Recipe", content: "To bake bread you need yeast" }];
|
||||
* const query = "What do you need to bake bread?";
|
||||
* const result = await reranker.rerank(documents, query);
|
||||
* console.log(result);
|
||||
*/
|
||||
export class MixedbreadAIReranker implements BaseNodePostprocessor {
|
||||
requestParams: RerankingRequestWithoutInput;
|
||||
requestOptions: MixedbreadAIClient.RequestOptions;
|
||||
|
||||
private readonly client: MixedbreadAIClient;
|
||||
|
||||
/**
|
||||
* Constructor for MixedbreadRerank.
|
||||
* @param {Partial<MixedbreadAIRerankerParams>} params - An optional object with properties to configure the instance.
|
||||
* @throws {Error} If the API key is not provided or found in the environment variables.
|
||||
*/
|
||||
constructor(params: Partial<MixedbreadAIRerankerParams>) {
|
||||
const apiKey = params?.apiKey ?? getEnv("MXBAI_API_KEY");
|
||||
if (!apiKey) {
|
||||
throw new Error(
|
||||
"MixedbreadAI API key not found. Either provide it in the constructor or set the 'MXBAI_API_KEY' environment variable.",
|
||||
);
|
||||
}
|
||||
|
||||
this.requestOptions = {
|
||||
maxRetries: params?.maxRetries ?? 3,
|
||||
timeoutInSeconds: params?.timeoutInSeconds,
|
||||
// Support for this already exists in the python sdk and will be added to the js sdk soon
|
||||
// @ts-ignore
|
||||
additionalHeaders: {
|
||||
"user-agent": "@mixedbread-ai/llamaindex-ts-sdk",
|
||||
},
|
||||
};
|
||||
this.client = new MixedbreadAIClient({
|
||||
apiKey: apiKey,
|
||||
environment: params?.baseUrl,
|
||||
});
|
||||
this.requestParams = {
|
||||
model: params?.model ?? "default",
|
||||
returnInput: params?.returnInput ?? false,
|
||||
topK: params?.topK,
|
||||
rankFields: params?.rankFields,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Reranks the nodes using the mixedbread.ai API.
|
||||
* @param {NodeWithScore[]} nodes - Array of nodes with scores.
|
||||
* @param {MessageContent} [query] - Query string.
|
||||
* @throws {Error} If query is undefined.
|
||||
*
|
||||
* @returns {Promise<NodeWithScore[]>} A Promise that resolves to an ordered list of nodes with relevance scores.
|
||||
*
|
||||
* @example
|
||||
* const nodes = [{ node: new BaseNode('To bake bread you need flour') }, { node: new BaseNode('To bake bread you need yeast') }];
|
||||
* const query = "What do you need to bake bread?";
|
||||
* const result = await reranker.postprocessNodes(nodes, query);
|
||||
* console.log(result);
|
||||
*/
|
||||
async postprocessNodes(
|
||||
nodes: NodeWithScore[],
|
||||
query?: MessageContent,
|
||||
): Promise<NodeWithScore[]> {
|
||||
if (query === undefined) {
|
||||
throw new Error("MixedbreadAIReranker requires a query");
|
||||
}
|
||||
if (nodes.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const input = nodes.map((n) => n.node.getContent(MetadataMode.ALL));
|
||||
const result = await this.client.reranking(
|
||||
{
|
||||
query: extractText(query),
|
||||
input,
|
||||
...this.requestParams,
|
||||
},
|
||||
this.requestOptions,
|
||||
);
|
||||
|
||||
const newNodes: NodeWithScore[] = [];
|
||||
for (const document of result.data) {
|
||||
const node = nodes[document.index];
|
||||
node.score = document.score;
|
||||
newNodes.push(node);
|
||||
}
|
||||
|
||||
return newNodes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an ordered list of documents sorted by their relevance to the provided query.
|
||||
* @param {(Array<string> | Array<BaseNode> | Array<Record<string, unknown>>)} nodes - A list of documents as strings, DocumentInterfaces, or objects with a `pageContent` key.
|
||||
* @param {string} query - The query to use for reranking the documents.
|
||||
* @param {RerankingRequestWithoutInput} [options] - Optional parameters for reranking.
|
||||
*
|
||||
* @returns {Promise<Array<MixedbreadAI.RankedDocument>>} A Promise that resolves to an ordered list of documents with relevance scores.
|
||||
*
|
||||
* @example
|
||||
* const nodes = ["To bake bread you need flour", "To bake bread you need yeast"];
|
||||
* const query = "What do you need to bake bread?";
|
||||
* const result = await reranker.rerank(nodes, query);
|
||||
* console.log(result);
|
||||
*/
|
||||
async rerank(
|
||||
nodes: Array<string> | Array<BaseNode> | Array<Record<string, unknown>>,
|
||||
query: string,
|
||||
options?: RerankingRequestWithoutInput,
|
||||
): Promise<Array<MixedbreadAI.RankedDocument>> {
|
||||
if (nodes.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const input =
|
||||
typeof nodes[0] === "object" && "node" in nodes[0]
|
||||
? (nodes as BaseNode[]).map((n) => n.getContent(MetadataMode.ALL))
|
||||
: (nodes as string[]);
|
||||
|
||||
const result = await this.client.reranking(
|
||||
{
|
||||
query,
|
||||
input,
|
||||
...this.requestParams,
|
||||
...options,
|
||||
},
|
||||
this.requestOptions,
|
||||
);
|
||||
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
@@ -1,2 +1,3 @@
|
||||
export * from "./CohereRerank.js";
|
||||
export * from "./JinaAIReranker.js";
|
||||
export * from "./MixedbreadAIReranker.js";
|
||||
|
||||
Generated
+3772
-4447
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user