Compare commits

..

48 Commits

Author SHA1 Message Date
github-actions[bot] c1578a19d9 Release 0.7.1 (#1342)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: himself65 <himself65@users.noreply.github.com>
2024-10-20 15:29:19 -07:00
Alex Yang ae49ff4e15 feat: use gpt-tokenizer (#1352) 2024-10-20 15:18:30 -07:00
Alex Yang a75af835a5 chore: fix misc before release (#1351) 2024-10-20 14:34:21 -07:00
Alex Yang 7c7cd34908 fix(pg): allow passing perform setup (#1350) 2024-10-20 14:01:24 -07:00
Alex Yang f651891196 fix: remove internal getImageEmbedModel 2024-10-20 13:21:15 -07:00
Alex Yang 04714c886f chore: move under providers directory (#1349) 2024-10-19 20:19:12 -07:00
Alex Yang cf28574f51 refactor: move clip&huggingface embedding into single package (#1346) 2024-10-19 18:39:52 -07:00
Jason Musgrave 24d065f054 feat: log api response from failed parse jobs (#1348) 2024-10-19 18:39:28 -07:00
Alex Yang b8719586e3 ci: pack all module under packages (#1345) 2024-10-18 17:26:40 -07:00
Alex Yang 07a40aca49 refactor: move llm into single packages (#1344) 2024-10-18 16:12:52 -07:00
Alex Yang 33b562938d refactor: move data-structs module (#1343) 2024-10-18 14:52:39 -07:00
Alex Yang 723b41c23c refactor: move tools into core module (#1316) 2024-10-18 09:45:01 -07:00
Alex Yang 4c38c1be0b fix: do not detect file type in sdk (#1340) 2024-10-18 09:36:01 -07:00
Alex Yang 0dde0ca27f ci: fix pre-release (#1341) 2024-10-17 23:28:58 -07:00
github-actions[bot] f3e0d07f48 Release 0.7.0 (#1337)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: himself65 <himself65@users.noreply.github.com>
2024-10-17 11:18:29 -07:00
Bruno Bornsztein 1364e8eeed feat: update metadata extractor to use prompt template (#1338) 2024-10-17 11:10:41 -07:00
Bruno Bornsztein 96fc69cc61 feat: use promptTemplate arg correctly. (#1335) 2024-10-16 16:16:03 -07:00
Parham Saidi 3b7736f763 feat: added gemini 002 support (#1336) 2024-10-16 15:52:36 -07:00
Alex Yang a7a7afe66e fix: vector store type (#1334) 2024-10-15 11:53:35 -07:00
github-actions[bot] c646ee2eca Release 0.6.22 (#1333)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-10-15 11:27:21 +07:00
Marcus Schiesser 5729bd92fd fix: LlamaCloud API calls for ensuring and index and for file uploads (#1332) 2024-10-15 11:21:35 +07:00
github-actions[bot] e0e52cf879 Release 0.6.21 (#1329)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-10-14 15:36:53 +07:00
Thuc Pham 6f75306c17 feat: support metadata filters for Astra (#1330)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2024-10-14 15:31:00 +07:00
Thuc Pham 94cb4ad810 feat: ChromaDb metadata filters (#1323)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2024-10-14 10:21:52 +07:00
github-actions[bot] 1ea4014746 Release 0.6.20 (#1325)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-10-11 12:55:16 -07:00
Parham Saidi 6a9a7b1458 fix: use init api key for openai embeddings (#1324) 2024-10-11 12:20:20 -07:00
github-actions[bot] 1c168cd531 Release 0.6.19 (#1318)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-10-10 15:16:02 +07:00
Marcus Schiesser 62cba5236d feat: Add ensureIndex function to LlamaCloudIndex (#1321) 2024-10-10 14:49:12 +07:00
Thuc Pham d265e96420 fix: ignore webpack resolve unpdf for nextjs (#1320)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2024-10-10 14:22:38 +07:00
Marcus Schiesser d30bbf799f fix: Convert undefined values to null in LlamaCloud filters (#1319) 2024-10-10 12:00:16 +07:00
Marcus Schiesser 53fd00a7c3 fix: getPipelineId in LlamaCloudIndex (#1317) 2024-10-09 17:51:27 +07:00
Thuc Pham 83f2848d47 feat: add test split nodes with UUID (#1315) 2024-10-09 12:34:46 +07:00
github-actions[bot] 313071e9cd Release 0.6.18 (#1310)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-10-09 12:05:45 +07:00
Marcus Schiesser 5f6782038a Fix that node parsers generate nodes with UUIDs (#1311) 2024-10-09 11:56:02 +07:00
Marcus Schiesser fe08d0451b fix: llamacloud retrieval with multiple pipelines (#1309) 2024-10-09 11:39:55 +07:00
github-actions[bot] 59c5e5c3d4 Release 0.6.17 (#1305)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-10-07 14:44:04 +07:00
Thuc Pham ee697fb1b3 fix: generate uuid when inserting to Qdrant (#1301) 2024-10-07 14:17:04 +07:00
Alex Yang cf3320a4ea fix: improve getResponseSynthesizer type (#1304) 2024-10-06 19:15:55 -07:00
github-actions[bot] f2ed69f2f8 Release 0.6.16 (#1300)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-10-06 18:25:11 -07:00
Alex Yang 3489e7de84 fix: num output incorrect in prompt helper (#1303) 2024-10-06 18:19:05 -07:00
Alex Yang 468bda594e fix: correct warning when chunk size smaller than 0 (#1297) 2024-10-04 12:01:10 -07:00
Thuc Pham 6f3a31caf6 feat: add metadata filters for vector stores (#1289) 2024-10-04 14:25:11 +07:00
Thuc Pham 63e9846e97 fix: preFilters doesnot work with asQueryEngine (#1298) 2024-10-04 14:24:01 +07:00
github-actions[bot] b7382b0d24 Release 0.6.15 (#1295)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-10-03 19:44:55 -07:00
Alex Yang 2a8241328d fix: lazy load openai (#1294) 2024-10-03 17:12:33 -07:00
Alex Yang 0b20ff9f17 fix(cloud): package.json format (#1291) 2024-10-03 17:07:50 -07:00
github-actions[bot] 1fc26046e3 Release 0.6.14 (#1290)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-10-03 16:35:54 -07:00
LAWG b17d439d6d fix: ensure id_ is correctly passed during creation (#1282)
Co-authored-by: lawrencegb <lawrence@3api.com>
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-10-03 11:52:26 -07:00
198 changed files with 8325 additions and 6466 deletions
+1 -1
View File
@@ -25,4 +25,4 @@ jobs:
run: pnpm run build run: pnpm run build
- name: Pre Release - name: Pre Release
run: pnpx pkg-pr-new publish ./packages/* run: pnpx pkg-pr-new publish ./packages/* ./packages/providers/*
+20 -21
View File
@@ -136,27 +136,26 @@ jobs:
run: pnpm run build run: pnpm run build
- name: Copy examples - name: Copy examples
run: rsync -rv --exclude=node_modules ./examples ${{ runner.temp }} run: rsync -rv --exclude=node_modules ./examples ${{ runner.temp }}
- name: Pack @llamaindex/cloud - name: Pack packages
run: pnpm pack --pack-destination ${{ runner.temp }} run: |
working-directory: packages/cloud for dir in packages/*; do
- name: Pack @llamaindex/openai if [ -d "$dir" ] && [ -f "$dir/package.json" ] && [[ ! "$dir" =~ autotool ]]; then
run: pnpm pack --pack-destination ${{ runner.temp }} echo "Packing $dir"
working-directory: packages/llm/openai pnpm pack --pack-destination ${{ runner.temp }} -C $dir
- name: Pack @llamaindex/groq else
run: pnpm pack --pack-destination ${{ runner.temp }} echo "Skipping $dir, no package.json found"
working-directory: packages/llm/groq fi
- name: Pack @llamaindex/ollama done
run: pnpm pack --pack-destination ${{ runner.temp }} - name: Pack provider packages
working-directory: packages/llm/ollama run: |
- name: Pack @llamaindex/core for dir in packages/providers/*; do
run: pnpm pack --pack-destination ${{ runner.temp }} if [ -d "$dir" ] && [ -f "$dir/package.json" ]; then
working-directory: packages/core echo "Packing $dir"
- name: Pack @llamaindex/env pnpm pack --pack-destination ${{ runner.temp }} -C $dir
run: pnpm pack --pack-destination ${{ runner.temp }} else
working-directory: packages/env echo "Skipping $dir, no package.json found"
- name: Pack llamaindex fi
run: pnpm pack --pack-destination ${{ runner.temp }} done
working-directory: packages/llamaindex
- name: Install - name: Install
run: npm add ${{ runner.temp }}/*.tgz run: npm add ${{ runner.temp }}/*.tgz
working-directory: ${{ runner.temp }}/examples working-directory: ${{ runner.temp }}/examples
+88
View File
@@ -1,5 +1,93 @@
# docs # docs
## 0.0.93
### Patch Changes
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
## 0.0.92
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
- @llamaindex/examples@0.0.9
## 0.0.91
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
## 0.0.90
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
## 0.0.89
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
## 0.0.88
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
## 0.0.87
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
## 0.0.86
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
## 0.0.85
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
## 0.0.84
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
## 0.0.83
### Patch Changes
- llamaindex@0.6.14
## 0.0.82 ## 0.0.82
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "docs", "name": "docs",
"version": "0.0.82", "version": "0.0.93",
"private": true, "private": true,
"scripts": { "scripts": {
"docusaurus": "docusaurus", "docusaurus": "docusaurus",
+11
View File
@@ -1,5 +1,16 @@
# examples # examples
## 0.0.9
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [96fc69c]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
- @llamaindex/core@0.3.0
## 0.0.8 ## 0.0.8
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -13,7 +13,7 @@ import { FunctionTool, OpenAI, ToolCallOptions } from "llamaindex";
} }
})(); })();
async function callLLM(init: Partial<OpenAI>) { async function callLLM(init: { model: string }) {
const csvData = const csvData =
"Country,Average Height (cm)\nNetherlands,156\nDenmark,158\nNorway,160"; "Country,Average Height (cm)\nNetherlands,156\nDenmark,158\nNorway,160";
+5 -2
View File
@@ -1,6 +1,7 @@
import { import {
AstraDBVectorStore, AstraDBVectorStore,
Document, Document,
MetadataFilters,
storageContextFromDefaults, storageContextFromDefaults,
VectorStoreIndex, VectorStoreIndex,
} from "llamaindex"; } from "llamaindex";
@@ -42,8 +43,10 @@ async function main() {
const index = await VectorStoreIndex.fromDocuments(docs, { const index = await VectorStoreIndex.fromDocuments(docs, {
storageContext: ctx, storageContext: ctx,
}); });
const preFilters: MetadataFilters = {
const queryEngine = index.asQueryEngine(); filters: [{ key: "id", operator: "in", value: [123, 789] }],
}; // try changing the filters to see the different results
const queryEngine = index.asQueryEngine({ preFilters });
const response = await queryEngine.query({ const response = await queryEngine.query({
query: "Describe AstraDB.", query: "Describe AstraDB.",
}); });
+65 -39
View File
@@ -1,57 +1,83 @@
import { import {
ChromaVectorStore, ChromaVectorStore,
Document, Document,
MetadataFilters,
VectorStoreIndex, VectorStoreIndex,
storageContextFromDefaults, storageContextFromDefaults,
} from "llamaindex"; } from "llamaindex";
const collectionName = "dog_colors"; const collectionName = "dogs_with_color";
async function main() { async function main() {
try { try {
const docs = [
new Document({
text: "The dog is brown",
metadata: {
dogId: "1",
},
}),
new Document({
text: "The dog is red",
metadata: {
dogId: "2",
},
}),
];
console.log("Creating ChromaDB vector store");
const chromaVS = new ChromaVectorStore({ collectionName }); const chromaVS = new ChromaVectorStore({ collectionName });
const ctx = await storageContextFromDefaults({ vectorStore: chromaVS }); const index = await VectorStoreIndex.fromVectorStore(chromaVS);
console.log("Embedding documents and adding to index"); const queryFn = async (filters?: MetadataFilters) => {
const index = await VectorStoreIndex.fromDocuments(docs, { console.log("\nQuerying dogs by filters: ", JSON.stringify(filters));
storageContext: ctx, const query = "List all colors of dogs";
}); const queryEngine = index.asQueryEngine({
preFilters: filters,
similarityTopK: 3,
});
const response = await queryEngine.query({ query });
console.log(response.toString());
};
console.log("Querying index"); await queryFn(); // red, brown, yellow
const queryEngine = index.asQueryEngine({ await queryFn({ filters: [{ key: "dogId", value: "1", operator: "==" }] }); // brown
preFilters: { await queryFn({ filters: [{ key: "dogId", value: "1", operator: "!=" }] }); // red, yellow
filters: [ await queryFn({
{ filters: [
key: "dogId", { key: "dogId", value: "1", operator: "==" },
value: "2", { key: "dogId", value: "3", operator: "==" },
operator: "==", ],
}, condition: "or",
], }); // brown, yellow
}, await queryFn({
}); filters: [{ key: "dogId", value: ["1", "2"], operator: "in" }],
const response = await queryEngine.query({ }); // red, brown
query: "What is the color of the dog?",
});
console.log(response.toString());
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} }
} }
void main(); async function generate() {
const docs = [
new Document({
id_: "doc1",
text: "The dog is brown",
metadata: {
dogId: "1",
},
}),
new Document({
id_: "doc2",
text: "The dog is red",
metadata: {
dogId: "2",
},
}),
new Document({
id_: "doc3",
text: "The dog is yellow",
metadata: {
dogId: "3",
},
}),
];
console.log("Creating ChromaDB vector store");
const chromaVS = new ChromaVectorStore({ collectionName });
const ctx = await storageContextFromDefaults({ vectorStore: chromaVS });
console.log("Embedding documents and adding to index");
await VectorStoreIndex.fromDocuments(docs, {
storageContext: ctx,
});
}
(async () => {
await generate();
await main();
})();
+51
View File
@@ -0,0 +1,51 @@
import {
Document,
MetadataFilters,
Settings,
SimpleDocumentStore,
VectorStoreIndex,
storageContextFromDefaults,
} from "llamaindex";
async function getDataSource() {
const docs = [
new Document({ text: "The dog is brown", metadata: { dogId: "1" } }),
new Document({ text: "The dog is yellow", metadata: { dogId: "2" } }),
];
const storageContext = await storageContextFromDefaults({
persistDir: "./cache",
});
const numberOfDocs = Object.keys(
(storageContext.docStore as SimpleDocumentStore).toDict(),
).length;
if (numberOfDocs === 0) {
return await VectorStoreIndex.fromDocuments(docs, { storageContext });
}
return await VectorStoreIndex.init({
storageContext,
});
}
Settings.callbackManager.on("retrieve-end", (event) => {
const { nodes, query } = event.detail;
console.log(`${query.query} - Number of retrieved nodes:`, nodes.length);
});
async function main() {
const index = await getDataSource();
const filters: MetadataFilters = {
filters: [{ key: "dogId", value: "2", operator: "==" }],
};
const retriever = index.asRetriever({ similarityTopK: 3, filters });
const queryEngine = index.asQueryEngine({
similarityTopK: 3,
preFilters: filters,
});
console.log("Retriever and query engine should only retrieve 1 node:");
await retriever.retrieve({ query: "Retriever: get dog" });
await queryEngine.query({ query: "QueryEngine: get dog" });
}
void main();
+3 -3
View File
@@ -1,12 +1,12 @@
{ {
"name": "@llamaindex/examples", "name": "@llamaindex/examples",
"private": true, "private": true,
"version": "0.0.8", "version": "0.0.9",
"dependencies": { "dependencies": {
"@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/sha256-js": "^5.2.0",
"@azure/identity": "^4.4.1", "@azure/identity": "^4.4.1",
"@datastax/astra-db-ts": "^1.4.1", "@datastax/astra-db-ts": "^1.4.1",
"@llamaindex/core": "^0.2.0", "@llamaindex/core": "^0.3.0",
"@notionhq/client": "^2.2.15", "@notionhq/client": "^2.2.15",
"@pinecone-database/pinecone": "^3.0.2", "@pinecone-database/pinecone": "^3.0.2",
"@vercel/postgres": "^0.10.0", "@vercel/postgres": "^0.10.0",
@@ -15,7 +15,7 @@
"commander": "^12.1.0", "commander": "^12.1.0",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"js-tiktoken": "^1.0.14", "js-tiktoken": "^1.0.14",
"llamaindex": "^0.6.0", "llamaindex": "^0.7.0",
"mongodb": "^6.7.0", "mongodb": "^6.7.0",
"pathe": "^1.1.2", "pathe": "^1.1.2",
"postgres": "^3.4.4" "postgres": "^3.4.4"
+42
View File
@@ -39,6 +39,12 @@ async function main() {
dogId: "2", dogId: "2",
}, },
}), }),
new Document({
text: "The dog is black",
metadata: {
dogId: "3",
},
}),
]; ];
console.log("Creating QdrantDB vector store"); console.log("Creating QdrantDB vector store");
const qdrantVs = new QdrantVectorStore({ url: qdrantUrl, collectionName }); const qdrantVs = new QdrantVectorStore({ url: qdrantUrl, collectionName });
@@ -73,6 +79,42 @@ async function main() {
query: "What is the color of the dog?", query: "What is the color of the dog?",
}); });
console.log("Filter with dogId 2 response:", response.toString()); console.log("Filter with dogId 2 response:", response.toString());
console.log("Querying index with dogId !=2: Expected output: Not red");
const queryEngineNotDogId2 = index.asQueryEngine({
preFilters: {
filters: [
{
key: "dogId",
value: "2",
operator: "!=",
},
],
},
});
const responseNotDogId2 = await queryEngineNotDogId2.query({
query: "What is the color of the dog?",
});
console.log(responseNotDogId2.toString());
console.log(
"Querying index with dogId 2 or 3: Expected output: Red, Black",
);
const queryEngineIn = index.asQueryEngine({
preFilters: {
filters: [
{
key: "dogId",
value: ["2", "3"],
operator: "in",
},
],
},
});
const responseIn = await queryEngineIn.query({
query: "List all dogs",
});
console.log(responseIn.toString());
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} }
+3 -6
View File
@@ -25,12 +25,9 @@ async function main() {
similarityCutoff: 0.7, similarityCutoff: 0.7,
}); });
// TODO: cannot pass responseSynthesizer into retriever query engine // TODO: cannot pass responseSynthesizer into retriever query engine
const queryEngine = new RetrieverQueryEngine( const queryEngine = new RetrieverQueryEngine(retriever, undefined, [
retriever, nodePostprocessor,
undefined, ]);
undefined,
[nodePostprocessor],
);
const response = await queryEngine.query({ const response = await queryEngine.query({
query: "What did the author do growing up?", query: "What did the author do growing up?",
+3 -5
View File
@@ -1,4 +1,5 @@
import { import {
BaseVectorStore,
getResponseSynthesizer, getResponseSynthesizer,
OpenAI, OpenAI,
OpenAIEmbedding, OpenAIEmbedding,
@@ -6,7 +7,6 @@ import {
Settings, Settings,
TextNode, TextNode,
VectorIndexRetriever, VectorIndexRetriever,
VectorStore,
VectorStoreIndex, VectorStoreIndex,
VectorStoreQuery, VectorStoreQuery,
VectorStoreQueryResult, VectorStoreQueryResult,
@@ -24,7 +24,7 @@ Settings.llm = new OpenAI({
* Please do not use this class in production; it's only for demonstration purposes. * Please do not use this class in production; it's only for demonstration purposes.
*/ */
class PineconeVectorStore<T extends RecordMetadata = RecordMetadata> class PineconeVectorStore<T extends RecordMetadata = RecordMetadata>
implements VectorStore implements BaseVectorStore
{ {
storesText = true; storesText = true;
isEmbeddingQuery = false; isEmbeddingQuery = false;
@@ -165,9 +165,7 @@ async function main() {
}); });
const responseSynthesizer = getResponseSynthesizer("tree_summarize"); const responseSynthesizer = getResponseSynthesizer("tree_summarize");
return new RetrieverQueryEngine(retriever, responseSynthesizer, { return new RetrieverQueryEngine(retriever, responseSynthesizer);
filter,
});
}; };
// whatever is a key from your metadata // whatever is a key from your metadata
+88
View File
@@ -1,5 +1,93 @@
# @llamaindex/autotool # @llamaindex/autotool
## 4.0.1
### Patch Changes
- a75af83: refactor: move some llm and embedding to single package
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
## 4.0.0
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
## 3.0.22
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
## 3.0.21
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
## 3.0.20
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
## 3.0.19
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
## 3.0.18
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
## 3.0.17
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
## 3.0.16
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
## 3.0.15
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
## 3.0.14
### Patch Changes
- llamaindex@0.6.14
## 3.0.13 ## 3.0.13
### Patch Changes ### Patch Changes
@@ -1,5 +1,103 @@
# @llamaindex/autotool-01-node-example # @llamaindex/autotool-01-node-example
## 0.0.33
### Patch Changes
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
- @llamaindex/autotool@4.0.1
## 0.0.32
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
- @llamaindex/autotool@4.0.0
## 0.0.31
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
- @llamaindex/autotool@3.0.22
## 0.0.30
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
- @llamaindex/autotool@3.0.21
## 0.0.29
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
- @llamaindex/autotool@3.0.20
## 0.0.28
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
- @llamaindex/autotool@3.0.19
## 0.0.27
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
- @llamaindex/autotool@3.0.18
## 0.0.26
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
- @llamaindex/autotool@3.0.17
## 0.0.25
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
- @llamaindex/autotool@3.0.16
## 0.0.24
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
- @llamaindex/autotool@3.0.15
## 0.0.23
### Patch Changes
- llamaindex@0.6.14
- @llamaindex/autotool@3.0.14
## 0.0.22 ## 0.0.22
### Patch Changes ### Patch Changes
@@ -13,5 +13,5 @@
"scripts": { "scripts": {
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts" "start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
}, },
"version": "0.0.22" "version": "0.0.33"
} }
@@ -1,5 +1,103 @@
# @llamaindex/autotool-02-next-example # @llamaindex/autotool-02-next-example
## 0.1.77
### Patch Changes
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
- @llamaindex/autotool@4.0.1
## 0.1.76
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
- @llamaindex/autotool@4.0.0
## 0.1.75
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
- @llamaindex/autotool@3.0.22
## 0.1.74
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
- @llamaindex/autotool@3.0.21
## 0.1.73
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
- @llamaindex/autotool@3.0.20
## 0.1.72
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
- @llamaindex/autotool@3.0.19
## 0.1.71
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
- @llamaindex/autotool@3.0.18
## 0.1.70
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
- @llamaindex/autotool@3.0.17
## 0.1.69
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
- @llamaindex/autotool@3.0.16
## 0.1.68
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
- @llamaindex/autotool@3.0.15
## 0.1.67
### Patch Changes
- llamaindex@0.6.14
- @llamaindex/autotool@3.0.14
## 0.1.66 ## 0.1.66
### Patch Changes ### Patch Changes
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/autotool-02-next-example", "name": "@llamaindex/autotool-02-next-example",
"private": true, "private": true,
"version": "0.1.66", "version": "0.1.77",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
"build": "next build", "build": "next build",
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/autotool", "name": "@llamaindex/autotool",
"type": "module", "type": "module",
"version": "3.0.13", "version": "4.0.1",
"description": "auto transpile your JS function to LLM Agent compatible", "description": "auto transpile your JS function to LLM Agent compatible",
"files": [ "files": [
"dist", "dist",
@@ -70,7 +70,7 @@
"@swc/types": "^0.1.12", "@swc/types": "^0.1.12",
"@types/json-schema": "^7.0.15", "@types/json-schema": "^7.0.15",
"@types/node": "^22.5.1", "@types/node": "^22.5.1",
"bunchee": "5.3.2", "bunchee": "5.5.1",
"llamaindex": "workspace:*", "llamaindex": "workspace:*",
"next": "14.2.11", "next": "14.2.11",
"rollup": "^4.21.2", "rollup": "^4.21.2",
+48
View File
@@ -1,5 +1,53 @@
# @llamaindex/cloud # @llamaindex/cloud
## 1.0.1
### Patch Changes
- 4c38c1b: fix(cloud): do not detect file type in llama parse
- 24d065f: Log Parse Job Errors when verbose is enabled
- a75af83: refactor: move some llm and embedding to single package
- Updated dependencies [ae49ff4]
- Updated dependencies [a75af83]
- @llamaindex/env@0.1.14
- @llamaindex/core@0.3.1
## 1.0.0
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [96fc69c]
- @llamaindex/core@0.3.0
## 0.2.14
### Patch Changes
- Updated dependencies [5f67820]
- @llamaindex/core@0.2.12
## 0.2.13
### Patch Changes
- Updated dependencies [ee697fb]
- @llamaindex/core@0.2.11
## 0.2.12
### Patch Changes
- Updated dependencies [3489e7d]
- Updated dependencies [468bda5]
- @llamaindex/core@0.2.10
## 0.2.11
### Patch Changes
- 0b20ff9: fix: package.json format
## 0.2.10 ## 0.2.10
### Patch Changes ### Patch Changes
+6 -9
View File
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/cloud", "name": "@llamaindex/cloud",
"version": "0.2.10", "version": "1.0.1",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
@@ -51,15 +51,12 @@
"devDependencies": { "devDependencies": {
"@hey-api/client-fetch": "^0.2.4", "@hey-api/client-fetch": "^0.2.4",
"@hey-api/openapi-ts": "^0.53.0", "@hey-api/openapi-ts": "^0.53.0",
"@llamaindex/core": "workspace:^0.2.8", "@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:^0.1.13", "@llamaindex/env": "workspace:*",
"bunchee": "5.3.2" "bunchee": "5.5.1"
}, },
"peerDependencies": { "peerDependencies": {
"@llamaindex/core": "workspace:^0.2.8", "@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:^0.1.13" "@llamaindex/env": "workspace:*"
},
"dependencies": {
"magic-bytes.js": "^1.10.0"
} }
} }
+6 -120
View File
@@ -1,7 +1,6 @@
import { type Client, createClient, createConfig } from "@hey-api/client-fetch"; import { type Client, createClient, createConfig } from "@hey-api/client-fetch";
import { Document, FileReader } from "@llamaindex/core/schema"; import { Document, FileReader } from "@llamaindex/core/schema";
import { fs, getEnv, path } from "@llamaindex/env"; import { fs, getEnv, path } from "@llamaindex/env";
import { filetypeinfo } from "magic-bytes.js";
import { import {
type Body_upload_file_api_v1_parsing_upload_post, type Body_upload_file_api_v1_parsing_upload_post,
type ParserLanguages, type ParserLanguages,
@@ -13,99 +12,6 @@ export type Language = ParserLanguages;
export type ResultType = "text" | "markdown" | "json"; export type ResultType = "text" | "markdown" | "json";
const SUPPORT_FILE_EXT: string[] = [
".pdf",
// document and presentations
".602",
".abw",
".cgm",
".cwk",
".doc",
".docx",
".docm",
".dot",
".dotm",
".hwp",
".key",
".lwp",
".mw",
".mcw",
".pages",
".pbd",
".ppt",
".pptm",
".pptx",
".pot",
".potm",
".potx",
".rtf",
".sda",
".sdd",
".sdp",
".sdw",
".sgl",
".sti",
".sxi",
".sxw",
".stw",
".sxg",
".txt",
".uof",
".uop",
".uot",
".vor",
".wpd",
".wps",
".xml",
".zabw",
".epub",
// images
".jpg",
".jpeg",
".png",
".gif",
".bmp",
".svg",
".tiff",
".webp",
// web
".htm",
".html",
// spreadsheets
".xlsx",
".xls",
".xlsm",
".xlsb",
".xlw",
".csv",
".dif",
".sylk",
".slk",
".prn",
".numbers",
".et",
".ods",
".fods",
".uos1",
".uos2",
".dbf",
".wk1",
".wk2",
".wk3",
".wk4",
".wks",
".123",
".wq1",
".wq2",
".wb1",
".wb2",
".wb3",
".qpw",
".xlr",
".eth",
".tsv",
];
//todo: should move into @llamaindex/env //todo: should move into @llamaindex/env
type WriteStream = { type WriteStream = {
write: (text: string) => void; write: (text: string) => void;
@@ -239,17 +145,12 @@ export class LlamaParseReader extends FileReader {
// Create a job for the LlamaParse API // Create a job for the LlamaParse API
private async createJob(data: Uint8Array): Promise<string> { private async createJob(data: Uint8Array): Promise<string> {
// Load data, set the mime type
const { mime } = await LlamaParseReader.getMimeType(data);
if (this.verbose) { if (this.verbose) {
console.log("Started uploading the file"); console.log("Started uploading the file");
} }
const body = { const body = {
file: new Blob([data], { file: new Blob([data]),
type: mime,
}),
language: this.language, language: this.language,
parsing_instruction: this.parsingInstruction, parsing_instruction: this.parsingInstruction,
skip_diagonal_text: this.skipDiagonalText, skip_diagonal_text: this.skipDiagonalText,
@@ -368,6 +269,11 @@ export class LlamaParseReader extends FileReader {
} }
tries++; tries++;
} else { } else {
if (this.verbose) {
console.error(
`Recieved Error response ${status} for job ${jobId}. Got Error Code: ${data.error_code} and Error Message: ${data.error_message}`,
);
}
throw new Error( throw new Error(
`Failed to parse the file: ${jobId}, status: ${status}`, `Failed to parse the file: ${jobId}, status: ${status}`,
); );
@@ -564,24 +470,4 @@ export class LlamaParseReader extends FileReader {
}), }),
); );
} }
static async getMimeType(
data: Uint8Array,
): Promise<{ mime: string; extension: string }> {
const typeinfos = filetypeinfo(data);
// find the first type info that matches the supported MIME types
// It could be happened that docx file is recognized as zip file, so we need to check the mime type
const info = typeinfos.find((info) => {
if (info.extension && SUPPORT_FILE_EXT.includes(`.${info.extension}`)) {
return info;
}
});
if (!info || !info.mime || !info.extension) {
const ext = SUPPORT_FILE_EXT.join(", ");
throw new Error(
`File has type which does not match supported MIME Types. Supported formats include: ${ext}`,
);
}
return { mime: info.mime, extension: info.extension };
}
} }
+47
View File
@@ -1,5 +1,52 @@
# @llamaindex/community # @llamaindex/community
## 0.0.49
### Patch Changes
- a75af83: refactor: move some llm and embedding to single package
- Updated dependencies [ae49ff4]
- Updated dependencies [a75af83]
- @llamaindex/env@0.1.14
- @llamaindex/core@0.3.1
## 0.0.48
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [96fc69c]
- @llamaindex/core@0.3.0
## 0.0.47
### Patch Changes
- Updated dependencies [5f67820]
- @llamaindex/core@0.2.12
## 0.0.46
### Patch Changes
- Updated dependencies [ee697fb]
- @llamaindex/core@0.2.11
## 0.0.45
### Patch Changes
- Updated dependencies [3489e7d]
- Updated dependencies [468bda5]
- @llamaindex/core@0.2.10
## 0.0.44
### Patch Changes
- Updated dependencies [b17d439]
- @llamaindex/core@0.2.9
## 0.0.43 ## 0.0.43
### Patch Changes ### Patch Changes
+3 -3
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/community", "name": "@llamaindex/community",
"description": "Community package for LlamaIndexTS", "description": "Community package for LlamaIndexTS",
"version": "0.0.43", "version": "0.0.49",
"type": "module", "type": "module",
"types": "dist/type/index.d.ts", "types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js", "main": "dist/cjs/index.js",
@@ -43,11 +43,11 @@
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^22.5.1", "@types/node": "^22.5.1",
"bunchee": "5.3.2" "bunchee": "5.5.1"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-bedrock-runtime": "^3.642.0",
"@aws-sdk/client-bedrock-agent-runtime": "^3.642.0", "@aws-sdk/client-bedrock-agent-runtime": "^3.642.0",
"@aws-sdk/client-bedrock-runtime": "^3.642.0",
"@llamaindex/core": "workspace:*", "@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*" "@llamaindex/env": "workspace:*"
} }
+41
View File
@@ -1,5 +1,46 @@
# @llamaindex/core # @llamaindex/core
## 0.3.1
### Patch Changes
- a75af83: refactor: move some llm and embedding to single package
- Updated dependencies [ae49ff4]
- Updated dependencies [a75af83]
- @llamaindex/env@0.1.14
## 0.3.0
### Minor Changes
- 1364e8e: update metadata extractors to use PromptTemplate
- 96fc69c: add defaultQuestionExtractPrompt
## 0.2.12
### Patch Changes
- 5f67820: Fix that node parsers generate nodes with UUIDs
## 0.2.11
### Patch Changes
- ee697fb: fix: generate uuid when inserting to Qdrant
## 0.2.10
### Patch Changes
- 3489e7d: fix: num output incorrect in prompt helper
- 468bda5: fix: correct warning when chunk size smaller than 0
## 0.2.9
### Patch Changes
- b17d439: Fix #1278: resolved issue where the id\_ was not correctly passed as the id when creating a TextNode. As a result, the upsert operation to the vector database was using a generated ID instead of the provided document ID, if available.
## 0.2.8 ## 0.2.8
### Patch Changes ### Patch Changes
+8
View File
@@ -0,0 +1,8 @@
{
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": "./dist/index.js",
"private": true
}
+42 -10
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/core", "name": "@llamaindex/core",
"type": "module", "type": "module",
"version": "0.2.8", "version": "0.3.1",
"description": "LlamaIndex Core Module", "description": "LlamaIndex Core Module",
"exports": { "exports": {
"./agent": { "./agent": {
@@ -258,16 +258,44 @@
}, },
"./vector-store": { "./vector-store": {
"require": { "require": {
"types": "./dist/vector-store/index.d.cts", "types": "./vector-store/dist/index.d.cts",
"default": "./dist/vector-store/index.cjs" "default": "./vector-store/dist/index.cjs"
}, },
"import": { "import": {
"types": "./dist/vector-store/index.d.ts", "types": "./vector-store/dist/index.d.ts",
"default": "./dist/vector-store/index.js" "default": "./vector-store/dist/index.js"
}, },
"default": { "default": {
"types": "./dist/vector-store/index.d.ts", "types": "./vector-store/dist/index.d.ts",
"default": "./dist/vector-store/index.js" "default": "./vector-store/dist/index.js"
}
},
"./tools": {
"require": {
"types": "./tools/dist/index.d.cts",
"default": "./tools/dist/index.cjs"
},
"import": {
"types": "./tools/dist/index.d.ts",
"default": "./tools/dist/index.js"
},
"default": {
"types": "./tools/dist/index.d.ts",
"default": "./tools/dist/index.js"
}
},
"./data-structs": {
"require": {
"types": "./data-structs/dist/index.d.cts",
"default": "./data-structs/dist/index.cjs"
},
"import": {
"types": "./data-structs/dist/index.d.ts",
"default": "./data-structs/dist/index.js"
},
"default": {
"types": "./data-structs/dist/index.d.ts",
"default": "./data-structs/dist/index.js"
} }
} }
}, },
@@ -289,7 +317,10 @@
"./storage", "./storage",
"./response-synthesizers", "./response-synthesizers",
"./chat-engine", "./chat-engine",
"./retriever" "./retriever",
"./vector-store",
"./tools",
"./data-structs"
], ],
"scripts": { "scripts": {
"dev": "bunchee --watch", "dev": "bunchee --watch",
@@ -303,7 +334,7 @@
"devDependencies": { "devDependencies": {
"@edge-runtime/vm": "^4.0.3", "@edge-runtime/vm": "^4.0.3",
"ajv": "^8.17.1", "ajv": "^8.17.1",
"bunchee": "5.3.2", "bunchee": "5.5.1",
"happy-dom": "^15.7.4", "happy-dom": "^15.7.4",
"natural": "^8.0.1", "natural": "^8.0.1",
"python-format-js": "^1.4.3" "python-format-js": "^1.4.3"
@@ -312,6 +343,7 @@
"@llamaindex/env": "workspace:*", "@llamaindex/env": "workspace:*",
"@types/node": "^22.5.1", "@types/node": "^22.5.1",
"magic-bytes.js": "^1.10.0", "magic-bytes.js": "^1.10.0",
"zod": "^3.23.8" "zod": "^3.23.8",
"zod-to-json-schema": "^3.23.3"
} }
} }
@@ -0,0 +1,67 @@
import { randomUUID } from "@llamaindex/env";
import type { UUID } from "../global";
import { IndexStructType } from "./struct-type";
export abstract class IndexStruct {
indexId: string;
summary: string | undefined;
constructor(
indexId: UUID = randomUUID(),
summary: string | undefined = undefined,
) {
this.indexId = indexId;
this.summary = summary;
}
toJson(): Record<string, unknown> {
return {
indexId: this.indexId,
summary: this.summary,
};
}
getSummary(): string {
if (this.summary === undefined) {
throw new Error("summary field of the index struct is not set");
}
return this.summary;
}
}
// A table of keywords mapping keywords to text chunks.
export class KeywordTable extends IndexStruct {
table: Map<string, Set<string>> = new Map();
type: IndexStructType = IndexStructType.KEYWORD_TABLE;
addNode(keywords: string[], nodeId: string): void {
keywords.forEach((keyword) => {
if (!this.table.has(keyword)) {
this.table.set(keyword, new Set());
}
this.table.get(keyword)!.add(nodeId);
});
}
deleteNode(keywords: string[], nodeId: string) {
keywords.forEach((keyword) => {
if (this.table.has(keyword)) {
this.table.get(keyword)!.delete(nodeId);
}
});
}
toJson(): Record<string, unknown> {
return {
...super.toJson(),
table: Array.from(this.table.entries()).reduce(
(acc, [keyword, nodeIds]) => {
acc[keyword] = Array.from(nodeIds);
return acc;
},
{} as Record<string, string[]>,
),
type: this.type,
};
}
}
+2
View File
@@ -0,0 +1,2 @@
export { IndexStruct, KeywordTable } from "./data-structs";
export { IndexStructType } from "./struct-type";
@@ -0,0 +1,39 @@
export const IndexStructType = {
NODE: "node",
TREE: "tree",
LIST: "list",
KEYWORD_TABLE: "keyword_table",
DICT: "dict",
SIMPLE_DICT: "simple_dict",
WEAVIATE: "weaviate",
PINECONE: "pinecone",
QDRANT: "qdrant",
LANCEDB: "lancedb",
MILVUS: "milvus",
CHROMA: "chroma",
MYSCALE: "myscale",
CLICKHOUSE: "clickhouse",
VECTOR_STORE: "vector_store",
OPENSEARCH: "opensearch",
DASHVECTOR: "dashvector",
CHATGPT_RETRIEVAL_PLUGIN: "chatgpt_retrieval_plugin",
DEEPLAKE: "deeplake",
EPSILLA: "epsilla",
MULTIMODAL_VECTOR_STORE: "multimodal",
SQL: "sql",
KG: "kg",
SIMPLE_KG: "simple_kg",
SIMPLE_LPG: "simple_lpg",
NEBULAGRAPH: "nebulagraph",
FALKORDB: "falkordb",
EMPTY: "empty",
COMPOSITE: "composite",
PANDAS: "pandas",
DOCUMENT_SUMMARY: "document_summary",
VECTARA: "vectara",
ZILLIZ_CLOUD_PIPELINE: "zilliz_cloud_pipeline",
POSTGRESML: "postgresml",
} as const;
export type IndexStructType =
(typeof IndexStructType)[keyof typeof IndexStructType];
+86 -62
View File
@@ -8,18 +8,16 @@ import {
Settings, Settings,
} from "../global"; } from "../global";
import type { LLMMetadata } from "../llms"; import type { LLMMetadata } from "../llms";
import { SentenceSplitter } from "../node-parser"; import { TextSplitter, TokenTextSplitter, truncateText } from "../node-parser";
import type { PromptTemplate } from "../prompts"; import { BasePromptTemplate, PromptTemplate } from "../prompts";
/** /**
* Get the empty prompt text given a prompt. * Get the empty prompt text given a prompt.
*/ */
function getEmptyPromptTxt(prompt: PromptTemplate) { function getEmptyPromptTxt(prompt: PromptTemplate): string {
return prompt.format({ return prompt.format(
...Object.fromEntries( Object.fromEntries([...prompt.templateVars.keys()].map((key) => [key, ""])),
[...prompt.templateVars.keys()].map((key) => [key, ""]), );
),
});
} }
/** /**
@@ -35,24 +33,24 @@ export function getBiggestPrompt(prompts: PromptTemplate[]): PromptTemplate {
} }
export type PromptHelperOptions = { export type PromptHelperOptions = {
contextWindow?: number; contextWindow?: number | undefined;
numOutput?: number; numOutput?: number | undefined;
chunkOverlapRatio?: number; chunkOverlapRatio?: number | undefined;
chunkSizeLimit?: number; chunkSizeLimit?: number | undefined;
tokenizer?: Tokenizer; tokenizer?: Tokenizer | undefined;
separator?: string; separator?: string | undefined;
}; };
/** /**
* A collection of helper functions for working with prompts. * A collection of helper functions for working with prompts.
*/ */
export class PromptHelper { export class PromptHelper {
contextWindow = DEFAULT_CONTEXT_WINDOW; contextWindow: number;
numOutput = DEFAULT_NUM_OUTPUTS; numOutput: number;
chunkOverlapRatio = DEFAULT_CHUNK_OVERLAP_RATIO; chunkOverlapRatio: number;
chunkSizeLimit: number | undefined; chunkSizeLimit: number | undefined;
tokenizer: Tokenizer; tokenizer: Tokenizer;
separator = " "; separator: string;
constructor(options: PromptHelperOptions = {}) { constructor(options: PromptHelperOptions = {}) {
const { const {
@@ -72,68 +70,93 @@ export class PromptHelper {
} }
/** /**
* Given a prompt, return the maximum size of the inputs to the prompt. * Calculate the available context size based on the number of prompt tokens.
* @param prompt
* @returns
*/ */
private getAvailableContextSize(prompt: PromptTemplate) { #getAvailableContextSize(numPromptTokens: number): number {
const emptyPromptText = getEmptyPromptTxt(prompt); const contextSizeTokens =
const promptTokens = this.tokenizer.encode(emptyPromptText); this.contextWindow - numPromptTokens - this.numOutput;
const numPromptTokens = promptTokens.length; if (contextSizeTokens < 0) {
throw new Error(
return this.contextWindow - numPromptTokens - this.numOutput; `Calculated available context size ${contextSizeTokens} is not non-negative.`,
} );
/**
* Find the maximum size of each chunk given a prompt.
*/
private getAvailableChunkSize(
prompt: PromptTemplate,
numChunks = 1,
padding = 5,
): number {
const availableContextSize = this.getAvailableContextSize(prompt);
const result = Math.floor(availableContextSize / numChunks) - padding;
if (this.chunkSizeLimit) {
return Math.min(this.chunkSizeLimit, result);
} else {
return result;
} }
return contextSizeTokens;
} }
/** /**
* Creates a text splitter with the correct chunk sizes and overlaps given a prompt. * Calculate the available chunk size based on the prompt and other parameters.
*/
#getAvailableChunkSize<Template extends BasePromptTemplate>(
prompt: Template,
numChunks: number = 1,
padding: number = 5,
): number {
let numPromptTokens = 0;
if (prompt instanceof PromptTemplate) {
numPromptTokens = this.tokenizer.encode(getEmptyPromptTxt(prompt)).length;
}
const availableContextSize = this.#getAvailableContextSize(numPromptTokens);
let result = Math.floor(availableContextSize / numChunks) - padding;
if (this.chunkSizeLimit !== undefined) {
result = Math.min(this.chunkSizeLimit, result);
}
return result;
}
/**
* Creates a text splitter configured to maximally pack the available context window.
*/ */
getTextSplitterGivenPrompt( getTextSplitterGivenPrompt(
prompt: PromptTemplate, prompt: BasePromptTemplate,
numChunks = 1, numChunks: number = 1,
padding = DEFAULT_PADDING, padding: number = DEFAULT_PADDING,
) { ): TextSplitter {
const chunkSize = this.getAvailableChunkSize(prompt, numChunks, padding); const chunkSize = this.#getAvailableChunkSize(prompt, numChunks, padding);
if (chunkSize === 0) { if (chunkSize <= 0) {
throw new Error("Got 0 as available chunk size"); throw new TypeError(`Chunk size ${chunkSize} is not positive.`);
} }
const chunkOverlap = this.chunkOverlapRatio * chunkSize; const chunkOverlap = Math.floor(this.chunkOverlapRatio * chunkSize);
return new SentenceSplitter({ return new TokenTextSplitter({
separator: this.separator,
chunkSize, chunkSize,
chunkOverlap, chunkOverlap,
separator: this.separator,
tokenizer: this.tokenizer, tokenizer: this.tokenizer,
}); });
} }
/** /**
* Repack resplits the strings based on the optimal text splitter. * Truncate text chunks to fit within the available context window.
*/
truncate(
prompt: BasePromptTemplate,
textChunks: string[],
padding: number = DEFAULT_PADDING,
): string[] {
const textSplitter = this.getTextSplitterGivenPrompt(
prompt,
textChunks.length,
padding,
);
return textChunks.map((chunk) => truncateText(chunk, textSplitter));
}
/**
* Repack text chunks to better utilize the available context window.
*/ */
repack( repack(
prompt: PromptTemplate, prompt: BasePromptTemplate,
textChunks: string[], textChunks: string[],
padding = DEFAULT_PADDING, padding: number = DEFAULT_PADDING,
) { ): string[] {
const textSplitter = this.getTextSplitterGivenPrompt(prompt, 1, padding); const textSplitter = this.getTextSplitterGivenPrompt(prompt, 1, padding);
const combinedStr = textChunks.join("\n\n"); const combinedStr = textChunks
.map((c) => c.trim())
.filter((c) => c.length > 0)
.join("\n\n");
return textSplitter.splitText(combinedStr); return textSplitter.splitText(combinedStr);
} }
@@ -154,7 +177,8 @@ export class PromptHelper {
} = options ?? {}; } = options ?? {};
return new PromptHelper({ return new PromptHelper({
contextWindow: metadata.contextWindow, contextWindow: metadata.contextWindow,
numOutput: metadata.maxTokens ?? DEFAULT_NUM_OUTPUTS, // fixme: numOutput is not in LLMMetadata
numOutput: DEFAULT_NUM_OUTPUTS,
chunkOverlapRatio, chunkOverlapRatio,
chunkSizeLimit, chunkSizeLimit,
tokenizer, tokenizer,
+2
View File
@@ -13,6 +13,7 @@ export { MetadataAwareTextSplitter, NodeParser, TextSplitter } from "./base";
export { MarkdownNodeParser } from "./markdown"; export { MarkdownNodeParser } from "./markdown";
export { SentenceSplitter } from "./sentence-splitter"; export { SentenceSplitter } from "./sentence-splitter";
export { SentenceWindowNodeParser } from "./sentence-window"; export { SentenceWindowNodeParser } from "./sentence-window";
export { TokenTextSplitter } from "./token-text-splitter";
export type { SplitterParams } from "./type"; export type { SplitterParams } from "./type";
export { export {
splitByChar, splitByChar,
@@ -20,5 +21,6 @@ export {
splitByRegex, splitByRegex,
splitBySentenceTokenizer, splitBySentenceTokenizer,
splitBySep, splitBySep,
truncateText,
} from "./utils"; } from "./utils";
export type { TextSplitterFn } from "./utils"; export type { TextSplitterFn } from "./utils";
@@ -0,0 +1,206 @@
import type { Tokenizer } from "@llamaindex/env";
import { z } from "zod";
import { DEFAULT_CHUNK_OVERLAP, DEFAULT_CHUNK_SIZE, Settings } from "../global";
import { MetadataAwareTextSplitter } from "./base";
import type { SplitterParams } from "./type";
import { splitByChar, splitBySep } from "./utils";
const DEFAULT_METADATA_FORMAT_LEN = 2;
const tokenTextSplitterSchema = z.object({
chunkSize: z.number().positive().default(DEFAULT_CHUNK_SIZE),
chunkOverlap: z.number().nonnegative().default(DEFAULT_CHUNK_OVERLAP),
separator: z.string().default(" "),
backupSeparators: z.array(z.string()).default(["\n"]),
});
export class TokenTextSplitter extends MetadataAwareTextSplitter {
chunkSize: number = DEFAULT_CHUNK_SIZE;
chunkOverlap: number = DEFAULT_CHUNK_OVERLAP;
separator: string = " ";
backupSeparators: string[] = ["\n"];
#tokenizer: Tokenizer;
#splitFns: Array<(text: string) => string[]> = [];
constructor(
params?: SplitterParams & Partial<z.infer<typeof tokenTextSplitterSchema>>,
) {
super();
if (params) {
const parsedParams = tokenTextSplitterSchema.parse(params);
this.chunkSize = parsedParams.chunkSize;
this.chunkOverlap = parsedParams.chunkOverlap;
this.separator = parsedParams.separator;
this.backupSeparators = parsedParams.backupSeparators;
}
if (this.chunkOverlap > this.chunkSize) {
throw new Error(
`Got a larger chunk overlap (${this.chunkOverlap}) than chunk size (${this.chunkSize}), should be smaller.`,
);
}
this.#tokenizer = params?.tokenizer ?? Settings.tokenizer;
const allSeparators = [this.separator, ...this.backupSeparators];
this.#splitFns = allSeparators.map((sep) => splitBySep(sep));
this.#splitFns.push(splitByChar());
}
/**
* Split text into chunks, reserving space required for metadata string.
* @param text The text to split.
* @param metadata The metadata string.
* @returns An array of text chunks.
*/
splitTextMetadataAware(text: string, metadata: string): string[] {
const metadataLength =
this.tokenSize(metadata) + DEFAULT_METADATA_FORMAT_LEN;
const effectiveChunkSize = this.chunkSize - metadataLength;
if (effectiveChunkSize <= 0) {
throw new Error(
`Metadata length (${metadataLength}) is longer than chunk size (${this.chunkSize}). ` +
`Consider increasing the chunk size or decreasing the size of your metadata to avoid this.`,
);
} else if (effectiveChunkSize < 50) {
console.warn(
`Metadata length (${metadataLength}) is close to chunk size (${this.chunkSize}). ` +
`Resulting chunks are less than 50 tokens. Consider increasing the chunk size or decreasing the size of your metadata to avoid this.`,
);
}
return this._splitText(text, effectiveChunkSize);
}
/**
* Split text into chunks.
* @param text The text to split.
* @returns An array of text chunks.
*/
splitText(text: string): string[] {
return this._splitText(text, this.chunkSize);
}
/**
* Internal method to split text into chunks up to a specified size.
* @param text The text to split.
* @param chunkSize The maximum size of each chunk.
* @returns An array of text chunks.
*/
private _splitText(text: string, chunkSize: number): string[] {
if (text === "") return [text];
// Dispatch chunking start event
Settings.callbackManager.dispatchEvent("chunking-start", { text: [text] });
const splits = this._split(text, chunkSize);
const chunks = this._merge(splits, chunkSize);
Settings.callbackManager.dispatchEvent("chunking-end", { chunks });
return chunks;
}
/**
* Break text into splits that are smaller than the chunk size.
* @param text The text to split.
* @param chunkSize The maximum size of each split.
* @returns An array of text splits.
*/
private _split(text: string, chunkSize: number): string[] {
if (this.tokenSize(text) <= chunkSize) {
return [text];
}
for (const splitFn of this.#splitFns) {
const splits = splitFn(text);
if (splits.length > 1) {
const newSplits: string[] = [];
for (const split of splits) {
const splitLen = this.tokenSize(split);
if (splitLen <= chunkSize) {
newSplits.push(split);
} else {
newSplits.push(...this._split(split, chunkSize));
}
}
return newSplits;
}
}
return [text];
}
/**
* Merge splits into chunks with overlap.
* @param splits The array of text splits.
* @param chunkSize The maximum size of each chunk.
* @returns An array of merged text chunks.
*/
private _merge(splits: string[], chunkSize: number): string[] {
const chunks: string[] = [];
let currentChunk: string[] = [];
let currentLength = 0;
for (const split of splits) {
const splitLength = this.tokenSize(split);
if (splitLength > chunkSize) {
console.warn(
`Got a split of size ${splitLength}, larger than chunk size ${chunkSize}.`,
);
}
if (currentLength + splitLength > chunkSize) {
const chunk = currentChunk.join("").trim();
if (chunk) {
chunks.push(chunk);
}
currentChunk = [];
currentLength = 0;
const overlapTokens = this.chunkOverlap;
const overlapSplits: string[] = [];
let overlapLength = 0;
while (
overlapSplits.length < splits.length &&
overlapLength < overlapTokens
) {
const overlapSplit = currentChunk.shift();
if (!overlapSplit) break;
overlapSplits.push(overlapSplit);
overlapLength += this.tokenSize(overlapSplit);
}
for (const overlapSplit of overlapSplits.reverse()) {
currentChunk.push(overlapSplit);
currentLength += this.tokenSize(overlapSplit);
if (currentLength >= overlapTokens) break;
}
}
currentChunk.push(split);
currentLength += splitLength;
}
const finalChunk = currentChunk.join("").trim();
if (finalChunk) {
chunks.push(finalChunk);
}
return chunks;
}
/**
* Calculate the number of tokens in the text using the tokenizer.
* @param text The text to tokenize.
* @returns The number of tokens.
*/
private tokenSize(text: string): number {
return this.#tokenizer.encode(text).length;
}
}
+4 -1
View File
@@ -3,7 +3,10 @@ import SentenceTokenizer from "./sentence_tokenizer";
export type TextSplitterFn = (text: string) => string[]; export type TextSplitterFn = (text: string) => string[];
const truncateText = (text: string, textSplitter: TextSplitter): string => { export const truncateText = (
text: string,
textSplitter: TextSplitter,
): string => {
const chunks = textSplitter.splitText(text); const chunks = textSplitter.splitText(text);
return chunks[0] ?? text; return chunks[0] ?? text;
}; };
+7
View File
@@ -12,11 +12,15 @@ export {
defaultCondenseQuestionPrompt, defaultCondenseQuestionPrompt,
defaultContextSystemPrompt, defaultContextSystemPrompt,
defaultKeywordExtractPrompt, defaultKeywordExtractPrompt,
defaultNodeTextTemplate,
defaultQueryKeywordExtractPrompt, defaultQueryKeywordExtractPrompt,
defaultQuestionExtractPrompt,
defaultRefinePrompt, defaultRefinePrompt,
defaultSubQuestionPrompt, defaultSubQuestionPrompt,
defaultSummaryPrompt, defaultSummaryPrompt,
defaultTextQAPrompt, defaultTextQAPrompt,
defaultTitleCombinePromptTemplate,
defaultTitleExtractorPromptTemplate,
defaultTreeSummarizePrompt, defaultTreeSummarizePrompt,
} from "./prompt"; } from "./prompt";
export type { export type {
@@ -25,9 +29,12 @@ export type {
ContextSystemPrompt, ContextSystemPrompt,
KeywordExtractPrompt, KeywordExtractPrompt,
QueryKeywordExtractPrompt, QueryKeywordExtractPrompt,
QuestionExtractPrompt,
RefinePrompt, RefinePrompt,
SubQuestionPrompt, SubQuestionPrompt,
SummaryPrompt, SummaryPrompt,
TextQAPrompt, TextQAPrompt,
TitleCombinePrompt,
TitleExtractorPrompt,
TreeSummarizePrompt, TreeSummarizePrompt,
} from "./prompt"; } from "./prompt";
+61 -3
View File
@@ -13,8 +13,12 @@ export type CondenseQuestionPrompt = PromptTemplate<
["chatHistory", "question"] ["chatHistory", "question"]
>; >;
export type ContextSystemPrompt = PromptTemplate<["context"]>; export type ContextSystemPrompt = PromptTemplate<["context"]>;
export type KeywordExtractPrompt = PromptTemplate<["context"]>; export type KeywordExtractPrompt = PromptTemplate<["context", "maxKeywords"]>;
export type QueryKeywordExtractPrompt = PromptTemplate<["question"]>; export type QueryKeywordExtractPrompt = PromptTemplate<["question"]>;
export type QuestionExtractPrompt = PromptTemplate<["context", "numQuestions"]>;
export type TitleExtractorPrompt = PromptTemplate<["context"]>;
export type TitleCombinePrompt = PromptTemplate<["context"]>;
export type KeywordExtractorPrompt = PromptTemplate<["context", "numKeywords"]>;
export const defaultTextQAPrompt: TextQAPrompt = new PromptTemplate({ export const defaultTextQAPrompt: TextQAPrompt = new PromptTemplate({
templateVars: ["context", "query"], templateVars: ["context", "query"],
@@ -64,11 +68,13 @@ export const defaultRefinePrompt: RefinePrompt = new PromptTemplate({
templateVars: ["query", "existingAnswer", "context"], templateVars: ["query", "existingAnswer", "context"],
template: `The original query is as follows: {query} template: `The original query is as follows: {query}
We have provided an existing answer: {existingAnswer} We have provided an existing answer: {existingAnswer}
We have the opportunity to refine the existing answer (only if needed) with some more context below. We have the opportunity to refine the existing answer
(only if needed) with some more context below.
------------ ------------
{context} {context}
------------ ------------
Given the new context, refine the original answer to better answer the query. If the context isn't useful, return the original answer. Given the new context, refine the original answer to better answer the query.
If the context isn't useful, return the original answer.
Refined Answer:`, Refined Answer:`,
}); });
@@ -251,3 +257,55 @@ export const defaultQueryKeywordExtractPrompt = new PromptTemplate({
}).partialFormat({ }).partialFormat({
maxKeywords: "10", maxKeywords: "10",
}); });
export const defaultQuestionExtractPrompt = new PromptTemplate({
templateVars: ["numQuestions", "context"],
template: `(
"Given the contextual informations below, generate {numQuestions} questions this context can provides specific answers to which are unlikely to be found else where. Higher-level summaries of surrounding context may be provided as well. "
"Try using these summaries to generate better questions that this context can answer."
"---------------------"
"{context}"
"---------------------"
"Provide questions in the following format: 'QUESTIONS: <questions>'"
)`,
}).partialFormat({
numQuestions: "5",
});
export const defaultTitleExtractorPromptTemplate = new PromptTemplate({
templateVars: ["context"],
template: `{context}
Give a title that summarizes all of the unique entities, titles or themes found in the context.
Title: `,
});
export const defaultTitleCombinePromptTemplate = new PromptTemplate({
templateVars: ["context"],
template: `{context}
Based on the above candidate titles and contents, what is the comprehensive title for this document?
Title: `,
});
export const defaultKeywordExtractorPromptTemplate = new PromptTemplate({
templateVars: ["context", "numKeywords"],
template: `{context}
Give {numKeywords} unique keywords for this document.
Format as comma separated.
Keywords: `,
}).partialFormat({
keywordCount: "5",
});
export const defaultNodeTextTemplate = new PromptTemplate({
templateVars: ["metadataStr", "content"],
template: `[Excerpt from document]
{metadataStr}
Excerpt:
-----
{content}
-----
`,
}).partialFormat({
metadataStr: "",
content: "",
});
@@ -403,27 +403,27 @@ class MultiModal extends BaseSynthesizer {
} }
} }
export function getResponseSynthesizer( const modeToSynthesizer = {
mode: ResponseMode, compact: CompactAndRefine,
refine: Refine,
tree_summarize: TreeSummarize,
multi_modal: MultiModal,
} as const;
export function getResponseSynthesizer<Mode extends ResponseMode>(
mode: Mode,
options: BaseSynthesizerOptions & { options: BaseSynthesizerOptions & {
textQATemplate?: TextQAPrompt; textQATemplate?: TextQAPrompt;
refineTemplate?: RefinePrompt; refineTemplate?: RefinePrompt;
summaryTemplate?: TreeSummarizePrompt; summaryTemplate?: TreeSummarizePrompt;
metadataMode?: MetadataMode; metadataMode?: MetadataMode;
} = {}, } = {},
) { ): InstanceType<(typeof modeToSynthesizer)[Mode]> {
switch (mode) { const Synthesizer: (typeof modeToSynthesizer)[Mode] = modeToSynthesizer[mode];
case "compact": { if (!Synthesizer) {
return new CompactAndRefine(options); throw new Error(`Invalid response mode: ${mode}`);
}
case "refine": {
return new Refine(options);
}
case "tree_summarize": {
return new TreeSummarize(options);
}
case "multi_modal": {
return new MultiModal(options);
}
} }
return new Synthesizer(options) as InstanceType<
(typeof modeToSynthesizer)[Mode]
>;
} }
+62
View File
@@ -0,0 +1,62 @@
import type { JSONSchemaType } from "ajv";
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";
import type { JSONValue } from "../global";
import type { BaseTool, ToolMetadata } from "../llms";
const kOriginalFn = Symbol("originalFn");
export class FunctionTool<T, R extends JSONValue | Promise<JSONValue>>
implements BaseTool<T>
{
[kOriginalFn]?: (input: T) => R;
#fn: (input: T) => R;
#metadata: ToolMetadata<JSONSchemaType<T>>;
// todo: for the future, we can use zod to validate the input parameters
#zodType: z.ZodType<T> | null = null;
constructor(
fn: (input: T) => R,
metadata: ToolMetadata<JSONSchemaType<T>>,
zodType?: z.ZodType<T>,
) {
this.#fn = fn;
this.#metadata = metadata;
if (zodType) {
this.#zodType = zodType;
}
}
static from<T>(
fn: (input: T) => JSONValue | Promise<JSONValue>,
schema: ToolMetadata<JSONSchemaType<T>>,
): FunctionTool<T, JSONValue | Promise<JSONValue>>;
static from<T, R extends z.ZodType<T>>(
fn: (input: T) => JSONValue | Promise<JSONValue>,
schema: Omit<ToolMetadata, "parameters"> & {
parameters: R;
},
): FunctionTool<T, JSONValue>;
static from(fn: any, schema: any): any {
if (schema.parameter instanceof z.ZodSchema) {
const jsonSchema = zodToJsonSchema(schema.parameter);
return new FunctionTool(
fn,
{
...schema,
parameters: jsonSchema,
},
schema.parameter,
);
}
return new FunctionTool(fn, schema);
}
get metadata(): BaseTool<T>["metadata"] {
return this.#metadata as BaseTool<T>["metadata"];
}
call(input: T) {
return this.#fn.call(null, input);
}
}
+1
View File
@@ -0,0 +1 @@
export { FunctionTool } from "./function-tool";
@@ -2,6 +2,7 @@ import {
SentenceSplitter, SentenceSplitter,
splitBySentenceTokenizer, splitBySentenceTokenizer,
} from "@llamaindex/core/node-parser"; } from "@llamaindex/core/node-parser";
import { Document } from "@llamaindex/core/schema";
import { describe, expect, test } from "vitest"; import { describe, expect, test } from "vitest";
describe("sentence splitter", () => { describe("sentence splitter", () => {
@@ -115,4 +116,26 @@ describe("sentence splitter", () => {
const split = splitBySentenceTokenizer(); const split = splitBySentenceTokenizer();
expect(split(text)).toEqual([text]); expect(split(text)).toEqual([text]);
}); });
test("split nodes with UUID IDs and correct relationships", () => {
const UUID_REGEX =
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const sentenceSplitter = new SentenceSplitter();
const docId = "test-doc-id";
const doc = new Document({
id_: docId,
text: "This is a test sentence. This is another test sentence.",
});
const nodes = sentenceSplitter.getNodesFromDocuments([doc]);
nodes.forEach((node) => {
// test node id should match uuid regex
expect(node.id_).toMatch(UUID_REGEX);
// test source reference to the doc ID
const source = node.relationships?.SOURCE;
expect(source).toBeDefined();
expect(source).toHaveProperty("nodeId");
expect((source as { nodeId: string }).nodeId).toEqual(docId);
});
});
}); });
+35
View File
@@ -0,0 +1,35 @@
import { FunctionTool } from "@llamaindex/core/tools";
import { describe, test } from "vitest";
import { z } from "zod";
describe("FunctionTool", () => {
test("type system", () => {
FunctionTool.from((input: string) => input, {
name: "test",
description: "test",
});
FunctionTool.from(({ input }: { input: string }) => input, {
name: "test",
description: "test",
parameters: {
type: "object",
properties: {
input: {
type: "string",
},
},
required: ["input"],
},
});
const inputSchema = z
.object({
input: z.string(),
})
.required();
FunctionTool.from(({ input }: { input: string }) => input, {
name: "test",
description: "test",
parameters: inputSchema,
});
});
});
+8
View File
@@ -0,0 +1,8 @@
{
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": "./dist/index.js",
"private": true
}
+8
View File
@@ -0,0 +1,8 @@
{
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": "./dist/index.js",
"private": true
}
+7
View File
@@ -1,5 +1,12 @@
# @llamaindex/env # @llamaindex/env
## 0.1.14
### Patch Changes
- ae49ff4: feat: use `gpt-tokenizer`
- a75af83: refactor: move some llm and embedding to single package
## 0.1.13 ## 0.1.13
### Patch Changes ### Patch Changes
+4 -4
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/env", "name": "@llamaindex/env",
"description": "environment wrapper, supports all JS environment including node, deno, bun, edge runtime, and cloudflare worker", "description": "environment wrapper, supports all JS environment including node, deno, bun, edge runtime, and cloudflare worker",
"version": "0.1.13", "version": "0.1.14",
"type": "module", "type": "module",
"types": "dist/type/index.d.ts", "types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js", "main": "dist/cjs/index.js",
@@ -75,8 +75,8 @@
"@swc/core": "^1.7.22", "@swc/core": "^1.7.22",
"@xenova/transformers": "^2.17.2", "@xenova/transformers": "^2.17.2",
"concurrently": "^8.2.2", "concurrently": "^8.2.2",
"gpt-tokenizer": "^2.5.0",
"pathe": "^1.1.2", "pathe": "^1.1.2",
"tiktoken": "^1.0.16",
"vitest": "^2.0.5" "vitest": "^2.0.5"
}, },
"dependencies": { "dependencies": {
@@ -85,9 +85,9 @@
"peerDependencies": { "peerDependencies": {
"@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/sha256-js": "^5.2.0",
"@xenova/transformers": "^2.17.2", "@xenova/transformers": "^2.17.2",
"gpt-tokenizer": "^2.5.0",
"js-tiktoken": "^1.0.12", "js-tiktoken": "^1.0.12",
"pathe": "^1.1.2", "pathe": "^1.1.2"
"tiktoken": "^1.0.15"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
"@aws-crypto/sha256-js": { "@aws-crypto/sha256-js": {
+1 -1
View File
@@ -14,7 +14,7 @@ export {
type OnLoad, type OnLoad,
} from "./multi-model/index.browser.js"; } from "./multi-model/index.browser.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js"; export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js";
export { NotSupportCurrentRuntimeClass } from "./utils/shared.js";
// @ts-expect-error // @ts-expect-error
if (typeof window === "undefined") { if (typeof window === "undefined") {
console.warn( console.warn(
+1
View File
@@ -14,3 +14,4 @@ export {
type OnLoad, type OnLoad,
} from "./multi-model/index.non-nodejs.js"; } from "./multi-model/index.non-nodejs.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js"; export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js";
export { NotSupportCurrentRuntimeClass } from "./utils/shared.js";
+1
View File
@@ -47,6 +47,7 @@ export {
getEnv, getEnv,
setEnvs, setEnvs,
} from "./utils/index.js"; } from "./utils/index.js";
export { NotSupportCurrentRuntimeClass } from "./utils/shared.js";
export { export {
createWriteStream, createWriteStream,
EOL, EOL,
+2
View File
@@ -7,6 +7,8 @@
*/ */
import { INTERNAL_ENV } from "./utils/index.js"; import { INTERNAL_ENV } from "./utils/index.js";
export { NotSupportCurrentRuntimeClass } from "./utils/shared.js";
export * from "./node-polyfill.js"; export * from "./node-polyfill.js";
export function getEnv(name: string): string | undefined { export function getEnv(name: string): string | undefined {
+7 -10
View File
@@ -2,21 +2,18 @@
import type { Tokenizer } from "./types.js"; import type { Tokenizer } from "./types.js";
import { Tokenizers } from "./types.js"; import { Tokenizers } from "./types.js";
import { get_encoding } from "tiktoken"; import cl100kBase from "gpt-tokenizer";
class TokenizerSingleton { class TokenizerSingleton {
private defaultTokenizer: Tokenizer; #defaultTokenizer: Tokenizer;
constructor() { constructor() {
const encoding = get_encoding("cl100k_base"); this.#defaultTokenizer = {
encode: (text: string): Uint32Array => {
this.defaultTokenizer = { return new Uint32Array(cl100kBase.encode(text));
encode: (text: string) => {
return encoding.encode(text);
}, },
decode: (tokens: Uint32Array) => { decode: (tokens: Uint32Array) => {
const text = encoding.decode(tokens); return cl100kBase.decode(tokens);
return new TextDecoder().decode(text);
}, },
}; };
} }
@@ -26,7 +23,7 @@ class TokenizerSingleton {
throw new Error(`Tokenizer encoding ${encoding} not yet supported`); throw new Error(`Tokenizer encoding ${encoding} not yet supported`);
} }
return this.defaultTokenizer; return this.#defaultTokenizer;
} }
} }
+13
View File
@@ -0,0 +1,13 @@
export class NotSupportCurrentRuntimeClass {
constructor(runtime: string) {
throw new Error(`Current environment ${runtime} is not supported`);
}
static bind(runtime: string) {
return class extends NotSupportCurrentRuntimeClass {
constructor(...args: any[]) {
super(runtime);
}
} as any;
}
}
+11
View File
@@ -0,0 +1,11 @@
import { describe, expect, it } from "vitest";
import { tokenizers } from "../src/tokenizers/node.js";
describe("tokenizer", () => {
it("should tokenize text", () => {
const tokenizer = tokenizers.tokenizer();
expect(tokenizer.decode(tokenizer.encode("hello world"))).toBe(
"hello world",
);
});
});
+88
View File
@@ -1,5 +1,93 @@
# @llamaindex/experimental # @llamaindex/experimental
## 0.0.102
### Patch Changes
- a75af83: refactor: move some llm and embedding to single package
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
## 0.0.101
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
## 0.0.100
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
## 0.0.99
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
## 0.0.98
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
## 0.0.97
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
## 0.0.96
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
## 0.0.95
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
## 0.0.94
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
## 0.0.93
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
## 0.0.92
### Patch Changes
- llamaindex@0.6.14
## 0.0.91 ## 0.0.91
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/experimental", "name": "@llamaindex/experimental",
"description": "Experimental package for LlamaIndexTS", "description": "Experimental package for LlamaIndexTS",
"version": "0.0.91", "version": "0.0.102",
"type": "module", "type": "module",
"types": "dist/type/index.d.ts", "types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js", "main": "dist/cjs/index.js",
+134
View File
@@ -1,5 +1,139 @@
# llamaindex # llamaindex
## 0.7.1
### Patch Changes
- ae49ff4: feat: use `gpt-tokenizer`
- 4c38c1b: fix(cloud): do not detect file type in llama parse
- a75af83: feat: allow passing perform setup in pg vector store
- a75af83: refactor: move some llm and embedding to single package
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [24d065f]
- Updated dependencies [a75af83]
- @llamaindex/env@0.1.14
- @llamaindex/cloud@1.0.1
- @llamaindex/huggingface@0.0.2
- @llamaindex/portkey-ai@0.0.2
- @llamaindex/anthropic@0.0.2
- @llamaindex/deepinfra@0.0.2
- @llamaindex/replicate@0.0.2
- @llamaindex/ollama@0.0.9
- @llamaindex/openai@0.1.18
- @llamaindex/clip@0.0.2
- @llamaindex/groq@0.0.17
- @llamaindex/core@0.3.1
## 0.7.0
### Minor Changes
- 1364e8e: update metadata extractors to use PromptTemplate
- 96fc69c: Correct initialization of QuestionsAnsweredExtractor so that it uses the promptTemplate arg when passed in
### Patch Changes
- 3b7736f: feat: added gemini 002 support
- Updated dependencies [1364e8e]
- Updated dependencies [96fc69c]
- @llamaindex/core@0.3.0
- @llamaindex/cloud@1.0.0
- @llamaindex/ollama@0.0.8
- @llamaindex/openai@0.1.17
- @llamaindex/groq@0.0.16
## 0.6.22
### Patch Changes
- 5729bd9: Fix LlamaCloud API calls for ensuring an index and for file uploads
## 0.6.21
### Patch Changes
- 6f75306: feat: support metadata filters for AstraDB
- 94cb4ad: feat: Add metadata filters to ChromaDb and update to 1.9.2
## 0.6.20
### Patch Changes
- 6a9a7b1: fix: take init api key into account
- Updated dependencies [6a9a7b1]
- @llamaindex/openai@0.1.16
- @llamaindex/groq@0.0.15
## 0.6.19
### Patch Changes
- 62cba52: Add ensureIndex function to LlamaCloudIndex
- d265e96: fix: ignore resolving unpdf for nextjs
- d30bbf7: Convert undefined values to null in LlamaCloud filters
- 53fd00a: Fix getPipelineId in LlamaCloudIndex
## 0.6.18
### Patch Changes
- 5f67820: Fix that node parsers generate nodes with UUIDs
- fe08d04: Fix LlamaCloud retrieval with multiple pipelines
- Updated dependencies [5f67820]
- @llamaindex/core@0.2.12
- @llamaindex/cloud@0.2.14
- @llamaindex/ollama@0.0.7
- @llamaindex/openai@0.1.15
- @llamaindex/groq@0.0.14
## 0.6.17
### Patch Changes
- ee697fb: fix: generate uuid when inserting to Qdrant
- Updated dependencies [ee697fb]
- @llamaindex/core@0.2.11
- @llamaindex/cloud@0.2.13
- @llamaindex/ollama@0.0.6
- @llamaindex/openai@0.1.14
- @llamaindex/groq@0.0.13
## 0.6.16
### Patch Changes
- 63e9846: fix: preFilters does not work with asQueryEngine
- 6f3a31c: feat: add metadata filters for Qdrant vector store
- Updated dependencies [3489e7d]
- Updated dependencies [468bda5]
- @llamaindex/core@0.2.10
- @llamaindex/cloud@0.2.12
- @llamaindex/ollama@0.0.5
- @llamaindex/openai@0.1.13
- @llamaindex/groq@0.0.12
## 0.6.15
### Patch Changes
- 2a82413: fix(core): set `Settings.llm` to OpenAI by default and support lazy load openai
- Updated dependencies [2a82413]
- Updated dependencies [0b20ff9]
- @llamaindex/groq@0.0.11
- @llamaindex/openai@0.1.12
- @llamaindex/cloud@0.2.11
## 0.6.14
### Patch Changes
- Updated dependencies [b17d439]
- @llamaindex/core@0.2.9
- @llamaindex/ollama@0.0.4
- @llamaindex/openai@0.1.11
- @llamaindex/groq@0.0.10
## 0.6.13 ## 0.6.13
### Patch Changes ### Patch Changes
@@ -1,5 +1,92 @@
# @llamaindex/cloudflare-worker-agent-test # @llamaindex/cloudflare-worker-agent-test
## 0.0.86
### Patch Changes
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
## 0.0.85
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
## 0.0.84
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
## 0.0.83
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
## 0.0.82
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
## 0.0.81
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
## 0.0.80
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
## 0.0.79
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
## 0.0.78
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
## 0.0.77
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
## 0.0.76
### Patch Changes
- llamaindex@0.6.14
## 0.0.75 ## 0.0.75
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/cloudflare-worker-agent-test", "name": "@llamaindex/cloudflare-worker-agent-test",
"version": "0.0.75", "version": "0.0.86",
"type": "module", "type": "module",
"private": true, "private": true,
"scripts": { "scripts": {
@@ -1,5 +1,45 @@
# @llamaindex/llama-parse-browser-test # @llamaindex/llama-parse-browser-test
## 0.0.12
### Patch Changes
- Updated dependencies [4c38c1b]
- Updated dependencies [24d065f]
- Updated dependencies [a75af83]
- @llamaindex/cloud@1.0.1
## 0.0.11
### Patch Changes
- @llamaindex/cloud@1.0.0
## 0.0.10
### Patch Changes
- @llamaindex/cloud@0.2.14
## 0.0.9
### Patch Changes
- @llamaindex/cloud@0.2.13
## 0.0.8
### Patch Changes
- @llamaindex/cloud@0.2.12
## 0.0.7
### Patch Changes
- Updated dependencies [0b20ff9]
- @llamaindex/cloud@0.2.11
## 0.0.6 ## 0.0.6
### Patch Changes ### Patch Changes
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/llama-parse-browser-test", "name": "@llamaindex/llama-parse-browser-test",
"private": true, "private": true,
"version": "0.0.6", "version": "0.0.12",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
@@ -1,5 +1,92 @@
# @llamaindex/next-agent-test # @llamaindex/next-agent-test
## 0.1.86
### Patch Changes
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
## 0.1.85
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
## 0.1.84
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
## 0.1.83
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
## 0.1.82
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
## 0.1.81
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
## 0.1.80
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
## 0.1.79
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
## 0.1.78
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
## 0.1.77
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
## 0.1.76
### Patch Changes
- llamaindex@0.6.14
## 0.1.75 ## 0.1.75
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/next-agent-test", "name": "@llamaindex/next-agent-test",
"version": "0.1.75", "version": "0.1.86",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -1,5 +1,92 @@
# test-edge-runtime # test-edge-runtime
## 0.1.85
### Patch Changes
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
## 0.1.84
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
## 0.1.83
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
## 0.1.82
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
## 0.1.81
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
## 0.1.80
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
## 0.1.79
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
## 0.1.78
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
## 0.1.77
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
## 0.1.76
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
## 0.1.75
### Patch Changes
- llamaindex@0.6.14
## 0.1.74 ## 0.1.74
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/nextjs-edge-runtime-test", "name": "@llamaindex/nextjs-edge-runtime-test",
"version": "0.1.74", "version": "0.1.85",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -1,19 +1,12 @@
import { tokenizerResultPromise } from "@/utils/llm"; import "@/utils/llm";
import { use } from "react";
export const runtime = "edge"; export const runtime = "edge";
export default function Home() { export default function Home() {
const result = use(tokenizerResultPromise);
return ( return (
<main> <main>
<div> <div>
<h1>Next.js Edge Runtime</h1> <h1>Next.js Edge Runtime</h1>
<div>
{result.map((value, index) => (
<span key={index}>{value}</span>
))}
</div>
</div> </div>
</main> </main>
); );
@@ -1,23 +1,8 @@
// test runtime // test runtime
import "llamaindex"; import "llamaindex";
import { ClipEmbedding } from "llamaindex";
import "llamaindex/readers/SimpleDirectoryReader"; import "llamaindex/readers/SimpleDirectoryReader";
// @ts-expect-error // @ts-expect-error
if (typeof EdgeRuntime !== "string") { if (typeof EdgeRuntime !== "string") {
throw new Error("Expected run in EdgeRuntime"); throw new Error("Expected run in EdgeRuntime");
} }
export const tokenizerResultPromise = new Promise<number[]>(
(resolve, reject) => {
const embedding = new ClipEmbedding();
//#region make sure @xenova/transformers is working in edge runtime
embedding
.getTokenizer()
.then((tokenizer) => {
resolve(tokenizer.encode("hello world"));
})
.catch(reject);
//#endregion
},
);
@@ -1,5 +1,92 @@
# @llamaindex/next-node-runtime # @llamaindex/next-node-runtime
## 0.0.67
### Patch Changes
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
## 0.0.66
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
## 0.0.65
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
## 0.0.64
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
## 0.0.63
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
## 0.0.62
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
## 0.0.61
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
## 0.0.60
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
## 0.0.59
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
## 0.0.58
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
## 0.0.57
### Patch Changes
- llamaindex@0.6.14
## 0.0.56 ## 0.0.56
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/next-node-runtime-test", "name": "@llamaindex/next-node-runtime-test",
"version": "0.0.56", "version": "0.0.67",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -1,5 +1,92 @@
# @llamaindex/waku-query-engine-test # @llamaindex/waku-query-engine-test
## 0.0.86
### Patch Changes
- Updated dependencies [ae49ff4]
- Updated dependencies [4c38c1b]
- Updated dependencies [a75af83]
- Updated dependencies [a75af83]
- llamaindex@0.7.1
## 0.0.85
### Patch Changes
- Updated dependencies [1364e8e]
- Updated dependencies [3b7736f]
- Updated dependencies [96fc69c]
- llamaindex@0.7.0
## 0.0.84
### Patch Changes
- Updated dependencies [5729bd9]
- llamaindex@0.6.22
## 0.0.83
### Patch Changes
- Updated dependencies [6f75306]
- Updated dependencies [94cb4ad]
- llamaindex@0.6.21
## 0.0.82
### Patch Changes
- Updated dependencies [6a9a7b1]
- llamaindex@0.6.20
## 0.0.81
### Patch Changes
- Updated dependencies [62cba52]
- Updated dependencies [d265e96]
- Updated dependencies [d30bbf7]
- Updated dependencies [53fd00a]
- llamaindex@0.6.19
## 0.0.80
### Patch Changes
- Updated dependencies [5f67820]
- Updated dependencies [fe08d04]
- llamaindex@0.6.18
## 0.0.79
### Patch Changes
- Updated dependencies [ee697fb]
- llamaindex@0.6.17
## 0.0.78
### Patch Changes
- Updated dependencies [63e9846]
- Updated dependencies [6f3a31c]
- llamaindex@0.6.16
## 0.0.77
### Patch Changes
- Updated dependencies [2a82413]
- llamaindex@0.6.15
## 0.0.76
### Patch Changes
- llamaindex@0.6.14
## 0.0.75 ## 0.0.75
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/waku-query-engine-test", "name": "@llamaindex/waku-query-engine-test",
"version": "0.0.75", "version": "0.0.86",
"type": "module", "type": "module",
"private": true, "private": true,
"scripts": { "scripts": {
@@ -10,17 +10,16 @@
}, },
"dependencies": { "dependencies": {
"llamaindex": "workspace:*", "llamaindex": "workspace:*",
"react": "19.0.0-rc-7771d3a7-20240827", "react": "19.0.0-rc-bf7e210c-20241017",
"react-dom": "19.0.0-rc-7771d3a7-20240827", "react-dom": "19.0.0-rc-bf7e210c-20241017",
"react-server-dom-webpack": "19.0.0-rc-7771d3a7-20240827", "react-server-dom-webpack": "19.0.0-rc-bf7e210c-20241017",
"waku": "0.21.1" "waku": "0.21.4"
}, },
"devDependencies": { "devDependencies": {
"@types/react": "18.3.5", "@types/react": "18.3.11",
"@types/react-dom": "18.3.0", "@types/react-dom": "18.3.1",
"autoprefixer": "10.4.20", "autoprefixer": "^10.4.20",
"tailwindcss": "3.4.10", "tailwindcss": "^3.4.14",
"typescript": "5.6.2", "typescript": "5.6.2"
"vite-plugin-wasm": "^3.3.0"
} }
} }
@@ -1,8 +0,0 @@
import wasm from "vite-plugin-wasm";
export default {
plugins: [wasm()],
ssr: {
external: ["tiktoken"],
},
};
@@ -105,3 +105,22 @@ await test("simple node", async (t) => {
assert.deepStrictEqual(result.nodes, []); assert.deepStrictEqual(result.nodes, []);
} }
}); });
await test("no setup", async (t) => {
// @ts-expect-error private method
assert.ok(PGVectorStore.prototype.checkSchema);
// @ts-expect-error private method
const Mock = class extends PGVectorStore {
private override async checkSchema(): Promise<any> {
throw new Error("should not be called");
}
};
const vectorStore = new Mock({
clientConfig: pgConfig,
performSetup: false,
});
const db = await vectorStore.client();
t.after(async () => {
await db.close();
});
});
+9 -5
View File
@@ -1,6 +1,6 @@
{ {
"name": "llamaindex", "name": "llamaindex",
"version": "0.6.13", "version": "0.7.1",
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"keywords": [ "keywords": [
@@ -29,13 +29,18 @@
"@google-cloud/vertexai": "1.2.0", "@google-cloud/vertexai": "1.2.0",
"@google/generative-ai": "0.12.0", "@google/generative-ai": "0.12.0",
"@grpc/grpc-js": "^1.11.1", "@grpc/grpc-js": "^1.11.1",
"@huggingface/inference": "^2.8.0", "@llamaindex/anthropic": "workspace:*",
"@llamaindex/clip": "workspace:*",
"@llamaindex/cloud": "workspace:*", "@llamaindex/cloud": "workspace:*",
"@llamaindex/core": "workspace:*", "@llamaindex/core": "workspace:*",
"@llamaindex/deepinfra": "workspace:*",
"@llamaindex/env": "workspace:*", "@llamaindex/env": "workspace:*",
"@llamaindex/groq": "workspace:*", "@llamaindex/groq": "workspace:*",
"@llamaindex/huggingface": "workspace:*",
"@llamaindex/ollama": "workspace:*", "@llamaindex/ollama": "workspace:*",
"@llamaindex/openai": "workspace:*", "@llamaindex/openai": "workspace:*",
"@llamaindex/portkey-ai": "workspace:*",
"@llamaindex/replicate": "workspace:^0.0.2",
"@mistralai/mistralai": "^1.0.4", "@mistralai/mistralai": "^1.0.4",
"@mixedbread-ai/sdk": "^2.2.11", "@mixedbread-ai/sdk": "^2.2.11",
"@pinecone-database/pinecone": "^3.0.2", "@pinecone-database/pinecone": "^3.0.2",
@@ -48,9 +53,10 @@
"@zilliz/milvus2-sdk-node": "^2.4.6", "@zilliz/milvus2-sdk-node": "^2.4.6",
"ajv": "^8.17.1", "ajv": "^8.17.1",
"assemblyai": "^4.7.0", "assemblyai": "^4.7.0",
"chromadb": "1.8.1", "chromadb": "1.9.2",
"cohere-ai": "7.13.0", "cohere-ai": "7.13.0",
"discord-api-types": "^0.37.98", "discord-api-types": "^0.37.98",
"gpt-tokenizer": "^2.5.0",
"groq-sdk": "^0.6.1", "groq-sdk": "^0.6.1",
"js-tiktoken": "^1.0.14", "js-tiktoken": "^1.0.14",
"lodash": "^4.17.21", "lodash": "^4.17.21",
@@ -62,10 +68,8 @@
"openai": "^4.60.0", "openai": "^4.60.0",
"papaparse": "^5.4.1", "papaparse": "^5.4.1",
"pathe": "^1.1.2", "pathe": "^1.1.2",
"portkey-ai": "0.1.16",
"rake-modified": "^1.0.8", "rake-modified": "^1.0.8",
"string-strip-html": "^13.4.8", "string-strip-html": "^13.4.8",
"tiktoken": "^1.0.15",
"unpdf": "^0.11.0", "unpdf": "^0.11.0",
"weaviate-client": "^3.1.4", "weaviate-client": "^3.1.4",
"wikipedia": "^2.1.2", "wikipedia": "^2.1.2",
-14
View File
@@ -2,7 +2,6 @@ import {
type CallbackManager, type CallbackManager,
Settings as CoreSettings, Settings as CoreSettings,
} from "@llamaindex/core/global"; } from "@llamaindex/core/global";
import { OpenAI } from "@llamaindex/openai";
import { PromptHelper } from "@llamaindex/core/indices"; import { PromptHelper } from "@llamaindex/core/indices";
@@ -12,7 +11,6 @@ import {
type NodeParser, type NodeParser,
SentenceSplitter, SentenceSplitter,
} from "@llamaindex/core/node-parser"; } from "@llamaindex/core/node-parser";
import type { LoadTransformerEvent } from "@llamaindex/env";
import { AsyncLocalStorage } from "@llamaindex/env"; import { AsyncLocalStorage } from "@llamaindex/env";
import type { ServiceContext } from "./ServiceContext.js"; import type { ServiceContext } from "./ServiceContext.js";
import { import {
@@ -21,12 +19,6 @@ import {
withEmbeddedModel, withEmbeddedModel,
} from "./internal/settings/EmbedModel.js"; } from "./internal/settings/EmbedModel.js";
declare module "@llamaindex/core/global" {
interface LlamaIndexEventMaps {
"load-transformers": LoadTransformerEvent;
}
}
export type PromptConfig = { export type PromptConfig = {
llm?: string; llm?: string;
lang?: string; lang?: string;
@@ -61,12 +53,6 @@ class GlobalSettings implements Config {
} }
get llm(): LLM { get llm(): LLM {
// fixme: we might need check internal error instead of try-catch here
try {
CoreSettings.llm;
} catch (error) {
CoreSettings.llm = new OpenAI();
}
return CoreSettings.llm; return CoreSettings.llm;
} }
+1 -43
View File
@@ -1,43 +1 @@
import { export * from "@llamaindex/anthropic";
LLMAgent,
LLMAgentWorker,
type LLMAgentParams,
} from "@llamaindex/core/agent";
import type {
NonStreamingChatEngineParams,
StreamingChatEngineParams,
} from "@llamaindex/core/chat-engine";
import type { EngineResponse } from "@llamaindex/core/schema";
import { Settings } from "../Settings.js";
import { Anthropic } from "../llm/anthropic.js";
export type AnthropicAgentParams = LLMAgentParams;
export class AnthropicAgentWorker extends LLMAgentWorker {}
export class AnthropicAgent extends LLMAgent {
constructor(params: AnthropicAgentParams) {
const llm =
params.llm ??
(Settings.llm instanceof Anthropic
? (Settings.llm as Anthropic)
: new Anthropic());
super({
...params,
llm,
});
}
async chat(params: NonStreamingChatEngineParams): Promise<EngineResponse>;
async chat(params: StreamingChatEngineParams): Promise<never>;
override async chat(
params: NonStreamingChatEngineParams | StreamingChatEngineParams,
) {
const { stream } = params;
if (stream) {
// Anthropic does support this, but looks like it's not supported in the LITS LLM
throw new Error("Anthropic does not support streaming");
}
return super.chat(params);
}
}
@@ -41,7 +41,7 @@ export class LLamaCloudFileService {
) { ) {
initService(); initService();
const { data: file } = await FilesService.uploadFileApiV1FilesPost({ const { data: file } = await FilesService.uploadFileApiV1FilesPost({
path: { project_id: projectId }, query: { project_id: projectId },
body: { body: {
upload_file: uploadFile, upload_file: uploadFile,
}, },
@@ -85,7 +85,7 @@ export class LLamaCloudFileService {
await new Promise((resolve) => setTimeout(resolve, 100)); // Sleep for 100ms await new Promise((resolve) => setTimeout(resolve, 100)); // Sleep for 100ms
} }
throw new Error( throw new Error(
`File processing did not complete after ${maxAttempts} attempts.`, `File processing did not complete after ${maxAttempts} attempts. Check your LlamaCloud index at https://cloud.llamaindex.ai/project/${projectId}/deploy/${pipelineId} for more details.`,
); );
} }
+116 -114
View File
@@ -1,19 +1,21 @@
import type { BaseQueryEngine } from "@llamaindex/core/query-engine"; import type { BaseQueryEngine } from "@llamaindex/core/query-engine";
import type { BaseSynthesizer } from "@llamaindex/core/response-synthesizers"; import type { BaseSynthesizer } from "@llamaindex/core/response-synthesizers";
import type { Document, TransformComponent } from "@llamaindex/core/schema"; import type { Document } from "@llamaindex/core/schema";
import { RetrieverQueryEngine } from "../engines/query/RetrieverQueryEngine.js"; import { RetrieverQueryEngine } from "../engines/query/RetrieverQueryEngine.js";
import type { BaseNodePostprocessor } from "../postprocessors/types.js"; import type { BaseNodePostprocessor } from "../postprocessors/types.js";
import type { CloudRetrieveParams } from "./LlamaCloudRetriever.js"; import type { CloudRetrieveParams } from "./LlamaCloudRetriever.js";
import { LlamaCloudRetriever } from "./LlamaCloudRetriever.js"; import { LlamaCloudRetriever } from "./LlamaCloudRetriever.js";
import { getPipelineCreate } from "./config.js";
import type { CloudConstructorParams } from "./type.js"; import type { CloudConstructorParams } from "./type.js";
import { getAppBaseUrl, getProjectId, initService } from "./utils.js"; import {
getAppBaseUrl,
getPipelineId,
getProjectId,
initService,
} from "./utils.js";
import { PipelinesService, ProjectsService } from "@llamaindex/cloud/api"; import { PipelinesService, type PipelineCreate } from "@llamaindex/cloud/api";
import { SentenceSplitter } from "@llamaindex/core/node-parser";
import type { BaseRetriever } from "@llamaindex/core/retriever"; import type { BaseRetriever } from "@llamaindex/core/retriever";
import { getEnv } from "@llamaindex/env"; import { getEnv } from "@llamaindex/env";
import { OpenAIEmbedding } from "@llamaindex/openai";
import { Settings } from "../Settings.js"; import { Settings } from "../Settings.js";
export class LlamaCloudIndex { export class LlamaCloudIndex {
@@ -28,10 +30,7 @@ export class LlamaCloudIndex {
verbose = Settings.debug, verbose = Settings.debug,
raiseOnError = false, raiseOnError = false,
): Promise<void> { ): Promise<void> {
const pipelineId = await this.getPipelineId( const pipelineId = await this.getPipelineId();
this.params.name,
this.params.projectName,
);
if (verbose) { if (verbose) {
console.log("Waiting for pipeline ingestion: "); console.log("Waiting for pipeline ingestion: ");
@@ -78,10 +77,7 @@ export class LlamaCloudIndex {
verbose = Settings.debug, verbose = Settings.debug,
raiseOnError = false, raiseOnError = false,
): Promise<void> { ): Promise<void> {
const pipelineId = await this.getPipelineId( const pipelineId = await this.getPipelineId();
this.params.name,
this.params.projectName,
);
if (verbose) { if (verbose) {
console.log("Loading data: "); console.log("Loading data: ");
@@ -143,17 +139,13 @@ export class LlamaCloudIndex {
public async getPipelineId( public async getPipelineId(
name?: string, name?: string,
projectName?: string, projectName?: string,
organizationId?: string,
): Promise<string> { ): Promise<string> {
const { data: pipelines } = return await getPipelineId(
await PipelinesService.searchPipelinesApiV1PipelinesGet({ name ?? this.params.name,
path: { projectName ?? this.params.projectName,
project_id: await this.getProjectId(projectName), organizationId ?? this.params.organizationId,
project_name: name ?? this.params.name, );
},
throwOnError: true,
});
return pipelines[0]!.id;
} }
public async getProjectId( public async getProjectId(
@@ -166,75 +158,42 @@ export class LlamaCloudIndex {
); );
} }
/**
* Adds documents to the given index parameters. If the index does not exist, it will be created.
*
* @param params - An object containing the following properties:
* - documents: An array of Document objects to be added to the index.
* - verbose: Optional boolean to enable verbose logging.
* - Additional properties from CloudConstructorParams.
* @returns A Promise that resolves to a new LlamaCloudIndex instance.
*/
static async fromDocuments( static async fromDocuments(
params: { params: {
documents: Document[]; documents: Document[];
transformations?: TransformComponent[];
verbose?: boolean; verbose?: boolean;
} & CloudConstructorParams, } & CloudConstructorParams,
config?: {
embedding: PipelineCreate["embedding_config"];
transform: PipelineCreate["transform_config"];
},
): Promise<LlamaCloudIndex> { ): Promise<LlamaCloudIndex> {
initService(params); const index = new LlamaCloudIndex({ ...params });
const defaultTransformations: TransformComponent[] = [ await index.ensureIndex({ ...config, verbose: params.verbose ?? false });
new SentenceSplitter(), await index.addDocuments(params.documents, params.verbose);
new OpenAIEmbedding({ return index;
apiKey: getEnv("OPENAI_API_KEY"), }
}),
]; async addDocuments(documents: Document[], verbose?: boolean): Promise<void> {
const apiUrl = getAppBaseUrl(); const apiUrl = getAppBaseUrl();
const projectId = await this.getProjectId();
const pipelineCreateParams = await getPipelineCreate({ const pipelineId = await this.getPipelineId();
pipelineName: params.name,
pipelineType: "MANAGED",
inputNodes: params.documents,
transformations: params.transformations ?? defaultTransformations,
});
const { data: project } =
await ProjectsService.upsertProjectApiV1ProjectsPut({
path: {
organization_id: params.organizationId,
},
body: {
name: params.projectName ?? "default",
},
throwOnError: true,
});
if (!project.id) {
throw new Error("Project ID should be defined");
}
const { data: pipeline } =
await PipelinesService.upsertPipelineApiV1PipelinesPut({
path: {
project_id: project.id,
},
body: pipelineCreateParams.configured_transformations
? {
name: params.name,
configured_transformations:
pipelineCreateParams.configured_transformations,
}
: {
name: params.name,
},
throwOnError: true,
});
if (!pipeline.id) {
throw new Error("Pipeline ID must be defined");
}
if (params.verbose) {
console.log(`Created pipeline ${pipeline.id} with name ${params.name}`);
}
await PipelinesService.upsertBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPut( await PipelinesService.upsertBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPut(
{ {
path: { path: {
pipeline_id: pipeline.id, pipeline_id: pipelineId,
}, },
body: params.documents.map((doc) => ({ body: documents.map((doc) => ({
metadata: doc.metadata, metadata: doc.metadata,
text: doc.text, text: doc.text,
excluded_embed_metadata_keys: doc.excludedEmbedMetadataKeys, excluded_embed_metadata_keys: doc.excludedEmbedMetadataKeys,
@@ -248,7 +207,7 @@ export class LlamaCloudIndex {
const { data: pipelineStatus } = const { data: pipelineStatus } =
await PipelinesService.getPipelineStatusApiV1PipelinesPipelineIdStatusGet( await PipelinesService.getPipelineStatusApiV1PipelinesPipelineIdStatusGet(
{ {
path: { pipeline_id: pipeline.id }, path: { pipeline_id: pipelineId },
throwOnError: true, throwOnError: true,
}, },
); );
@@ -262,32 +221,30 @@ export class LlamaCloudIndex {
if (pipelineStatus.status === "ERROR") { if (pipelineStatus.status === "ERROR") {
console.error( console.error(
`Some documents failed to ingest, check your pipeline logs at ${apiUrl}/project/${project.id}/deploy/${pipeline.id}`, `Some documents failed to ingest, check your pipeline logs at ${apiUrl}/project/${projectId}/deploy/${pipelineId}`,
); );
throw new Error("Some documents failed to ingest"); throw new Error("Some documents failed to ingest");
} }
if (pipelineStatus.status === "PARTIAL_SUCCESS") { if (pipelineStatus.status === "PARTIAL_SUCCESS") {
console.info( console.info(
`Documents ingestion partially succeeded, to check a more complete status check your pipeline at ${apiUrl}/project/${project.id}/deploy/${pipeline.id}`, `Documents ingestion partially succeeded, to check a more complete status check your pipeline at ${apiUrl}/project/${projectId}/deploy/${pipelineId}`,
); );
break; break;
} }
if (params.verbose) { if (verbose) {
process.stdout.write("."); process.stdout.write(".");
} }
await new Promise((resolve) => setTimeout(resolve, 1000)); await new Promise((resolve) => setTimeout(resolve, 1000));
} }
if (params.verbose) { if (verbose) {
console.info( console.info(
`Ingestion completed, find your index at ${apiUrl}/project/${project.id}/deploy/${pipeline.id}`, `Ingestion completed, find your index at ${apiUrl}/project/${projectId}/deploy/${pipelineId}`,
); );
} }
return new LlamaCloudIndex({ ...params });
} }
asRetriever(params: CloudRetrieveParams = {}): BaseRetriever { asRetriever(params: CloudRetrieveParams = {}): BaseRetriever {
@@ -308,20 +265,12 @@ export class LlamaCloudIndex {
return new RetrieverQueryEngine( return new RetrieverQueryEngine(
retriever, retriever,
params?.responseSynthesizer, params?.responseSynthesizer,
params?.preFilters,
params?.nodePostprocessors, params?.nodePostprocessors,
); );
} }
async insert(document: Document) { async insert(document: Document) {
const pipelineId = await this.getPipelineId( const pipelineId = await this.getPipelineId();
this.params.name,
this.params.projectName,
);
if (!pipelineId) {
throw new Error("We couldn't find the pipeline ID for the given name");
}
await PipelinesService.createBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPost( await PipelinesService.createBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPost(
{ {
@@ -344,14 +293,7 @@ export class LlamaCloudIndex {
} }
async delete(document: Document) { async delete(document: Document) {
const pipelineId = await this.getPipelineId( const pipelineId = await this.getPipelineId();
this.params.name,
this.params.projectName,
);
if (!pipelineId) {
throw new Error("We couldn't find the pipeline ID for the given name");
}
await PipelinesService.deletePipelineDocumentApiV1PipelinesPipelineIdDocumentsDocumentIdDelete( await PipelinesService.deletePipelineDocumentApiV1PipelinesPipelineIdDocumentsDocumentIdDelete(
{ {
@@ -366,14 +308,7 @@ export class LlamaCloudIndex {
} }
async refreshDoc(document: Document) { async refreshDoc(document: Document) {
const pipelineId = await this.getPipelineId( const pipelineId = await this.getPipelineId();
this.params.name,
this.params.projectName,
);
if (!pipelineId) {
throw new Error("We couldn't find the pipeline ID for the given name");
}
await PipelinesService.upsertBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPut( await PipelinesService.upsertBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPut(
{ {
@@ -394,4 +329,71 @@ export class LlamaCloudIndex {
await this.waitForDocumentIngestion([document.id_]); await this.waitForDocumentIngestion([document.id_]);
} }
public async ensureIndex(config?: {
embedding?: PipelineCreate["embedding_config"];
transform?: PipelineCreate["transform_config"];
verbose?: boolean;
}): Promise<void> {
const projectId = await this.getProjectId();
const { data: pipelines } =
await PipelinesService.searchPipelinesApiV1PipelinesGet({
query: {
project_id: projectId,
pipeline_name: this.params.name,
},
throwOnError: true,
});
if (pipelines.length === 0) {
// no pipeline found, create a new one
let embeddingConfig = config?.embedding;
if (!embeddingConfig) {
// no embedding config provided, use OpenAI as default
const openAIApiKey = getEnv("OPENAI_API_KEY");
const embeddingModel = getEnv("EMBEDDING_MODEL");
if (!openAIApiKey || !embeddingModel) {
throw new Error(
"No embedding configuration provided. Fallback to OpenAI embedding model. OPENAI_API_KEY and EMBEDDING_MODEL environment variables must be set.",
);
}
embeddingConfig = {
type: "OPENAI_EMBEDDING",
component: {
api_key: openAIApiKey,
model_name: embeddingModel,
},
};
}
let transformConfig = config?.transform;
if (!transformConfig) {
transformConfig = {
mode: "auto",
chunk_size: 1024,
chunk_overlap: 200,
};
}
const { data: pipeline } =
await PipelinesService.upsertPipelineApiV1PipelinesPut({
query: {
project_id: projectId,
},
body: {
name: this.params.name,
embedding_config: embeddingConfig,
transform_config: transformConfig,
},
throwOnError: true,
});
if (config?.verbose) {
console.log(
`Created pipeline ${pipeline.id} with name ${pipeline.name}`,
);
}
}
}
} }
@@ -1,4 +1,5 @@
import { import {
type MetadataFilter,
type MetadataFilters, type MetadataFilters,
PipelinesService, PipelinesService,
type RetrievalParams, type RetrievalParams,
@@ -11,7 +12,7 @@ import type { NodeWithScore } from "@llamaindex/core/schema";
import { jsonToNode, ObjectType } from "@llamaindex/core/schema"; import { jsonToNode, ObjectType } from "@llamaindex/core/schema";
import { extractText } from "@llamaindex/core/utils"; import { extractText } from "@llamaindex/core/utils";
import type { ClientParams, CloudConstructorParams } from "./type.js"; import type { ClientParams, CloudConstructorParams } from "./type.js";
import { getProjectId, initService } from "./utils.js"; import { getPipelineId, initService } from "./utils.js";
export type CloudRetrieveParams = Omit< export type CloudRetrieveParams = Omit<
RetrievalParams, RetrievalParams,
@@ -42,6 +43,24 @@ export class LlamaCloudRetriever extends BaseRetriever {
}); });
} }
// LlamaCloud expects null values for filters, but LlamaIndexTS uses undefined for empty values
// This function converts the undefined values to null
private convertFilter(filters?: MetadataFilters): MetadataFilters | null {
if (!filters) return null;
const processFilter = (
filter: MetadataFilter | MetadataFilters,
): MetadataFilter | MetadataFilters => {
if ("filters" in filter) {
// type MetadataFilters
return { ...filter, filters: filter.filters.map(processFilter) };
}
return { ...filter, value: filter.value ?? null };
};
return { ...filters, filters: filters.filters.map(processFilter) };
}
constructor(params: CloudConstructorParams & CloudRetrieveParams) { constructor(params: CloudConstructorParams & CloudRetrieveParams) {
super(); super();
this.clientParams = { apiKey: params.apiKey, baseUrl: params.baseUrl }; this.clientParams = { apiKey: params.apiKey, baseUrl: params.baseUrl };
@@ -57,45 +76,24 @@ export class LlamaCloudRetriever extends BaseRetriever {
} }
async _retrieve(query: QueryBundle): Promise<NodeWithScore[]> { async _retrieve(query: QueryBundle): Promise<NodeWithScore[]> {
const { data: pipelines } = const pipelineId = await getPipelineId(
await PipelinesService.searchPipelinesApiV1PipelinesGet({ this.pipelineName,
query: { this.projectName,
project_id: await getProjectId(this.projectName, this.organizationId), this.organizationId,
project_name: this.pipelineName, );
},
throwOnError: true,
});
if (pipelines.length === 0 || !pipelines[0]!.id) { const filters = this.convertFilter(this.retrieveParams.filters);
throw new Error(
`No pipeline found with name ${this.pipelineName} in project ${this.projectName}`,
);
}
const { data: pipeline } =
await PipelinesService.getPipelineApiV1PipelinesPipelineIdGet({
path: {
pipeline_id: pipelines[0]!.id,
},
throwOnError: true,
});
if (!pipeline) {
throw new Error(
`No pipeline found with name ${this.pipelineName} in project ${this.projectName}`,
);
}
const { data: results } = const { data: results } =
await PipelinesService.runSearchApiV1PipelinesPipelineIdRetrievePost({ await PipelinesService.runSearchApiV1PipelinesPipelineIdRetrievePost({
throwOnError: true, throwOnError: true,
path: { path: {
pipeline_id: pipeline.id, pipeline_id: pipelineId,
}, },
body: { body: {
...this.retrieveParams, ...this.retrieveParams,
query: extractText(query), query: extractText(query),
search_filters: this.retrieveParams.filters as MetadataFilters, search_filters: filters,
dense_similarity_top_k: this.retrieveParams.similarityTopK!, dense_similarity_top_k: this.retrieveParams.similarityTopK!,
}, },
}); });
-55
View File
@@ -1,55 +0,0 @@
import type {
ConfiguredTransformationItem,
PipelineCreate,
PipelineType,
} from "@llamaindex/cloud/api";
import { SentenceSplitter } from "@llamaindex/core/node-parser";
import { BaseNode, type TransformComponent } from "@llamaindex/core/schema";
import { OpenAIEmbedding } from "@llamaindex/openai";
export type GetPipelineCreateParams = {
pipelineName: string;
pipelineType: PipelineType;
transformations?: TransformComponent[];
inputNodes?: BaseNode[];
};
function getTransformationConfig(
transformation: TransformComponent,
): ConfiguredTransformationItem {
if (transformation instanceof SentenceSplitter) {
return {
configurable_transformation_type: "SENTENCE_AWARE_NODE_PARSER",
component: {
chunk_size: transformation.chunkSize, // TODO: set to public in SentenceSplitter
chunk_overlap: transformation.chunkOverlap, // TODO: set to public in SentenceSplitter
include_metadata: transformation.includeMetadata,
include_prev_next_rel: transformation.includePrevNextRel,
},
};
}
if (transformation instanceof OpenAIEmbedding) {
return {
configurable_transformation_type: "OPENAI_EMBEDDING",
component: {
model: transformation.model,
api_key: transformation.apiKey,
embed_batch_size: transformation.embedBatchSize,
dimensions: transformation.dimensions,
},
};
}
throw new Error(`Unsupported transformation: ${typeof transformation}`);
}
export async function getPipelineCreate(
params: GetPipelineCreateParams,
): Promise<PipelineCreate> {
const { pipelineName, pipelineType, transformations = [] } = params;
return {
name: pipelineName,
configured_transformations: transformations.map(getTransformationConfig),
pipeline_type: pipelineType,
};
}
+30 -3
View File
@@ -1,4 +1,8 @@
import { client, ProjectsService } from "@llamaindex/cloud/api"; import {
client,
PipelinesService,
ProjectsService,
} from "@llamaindex/cloud/api";
import { DEFAULT_BASE_URL } from "@llamaindex/core/global"; import { DEFAULT_BASE_URL } from "@llamaindex/core/global";
import { getEnv } from "@llamaindex/env"; import { getEnv } from "@llamaindex/env";
import type { ClientParams } from "./type.js"; import type { ClientParams } from "./type.js";
@@ -40,9 +44,9 @@ export async function getProjectId(
): Promise<string> { ): Promise<string> {
const { data: projects } = await ProjectsService.listProjectsApiV1ProjectsGet( const { data: projects } = await ProjectsService.listProjectsApiV1ProjectsGet(
{ {
path: { query: {
project_name: projectName, project_name: projectName,
organization_id: organizationId, organization_id: organizationId ?? null,
}, },
throwOnError: true, throwOnError: true,
}, },
@@ -66,3 +70,26 @@ export async function getProjectId(
return project.id; return project.id;
} }
export async function getPipelineId(
name: string,
projectName: string,
organizationId?: string,
): Promise<string> {
const { data: pipelines } =
await PipelinesService.searchPipelinesApiV1PipelinesGet({
query: {
project_id: await getProjectId(projectName, organizationId),
pipeline_name: name,
},
throwOnError: true,
});
if (pipelines.length === 0 || !pipelines[0]!.id) {
throw new Error(
`No pipeline found with name ${name} in project ${projectName}`,
);
}
return pipelines[0]!.id;
}
@@ -1,139 +1 @@
import { MultiModalEmbedding } from "@llamaindex/core/embeddings"; export * from "@llamaindex/clip";
import type { ImageType } from "@llamaindex/core/schema";
import _ from "lodash";
// only import type, to avoid bundling error
import { loadTransformers } from "@llamaindex/env";
import type {
CLIPTextModelWithProjection,
CLIPVisionModelWithProjection,
PreTrainedTokenizer,
Processor,
} from "@xenova/transformers";
import { Settings } from "../Settings.js";
async function readImage(input: ImageType) {
const { RawImage } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
if (input instanceof Blob) {
return await RawImage.fromBlob(input);
} else if (_.isString(input) || input instanceof URL) {
return await RawImage.fromURL(input);
} else {
throw new Error(`Unsupported input type: ${typeof input}`);
}
}
export enum ClipEmbeddingModelType {
XENOVA_CLIP_VIT_BASE_PATCH32 = "Xenova/clip-vit-base-patch32",
XENOVA_CLIP_VIT_BASE_PATCH16 = "Xenova/clip-vit-base-patch16",
}
export class ClipEmbedding extends MultiModalEmbedding {
modelType: ClipEmbeddingModelType =
ClipEmbeddingModelType.XENOVA_CLIP_VIT_BASE_PATCH16;
private tokenizer: PreTrainedTokenizer | null = null;
private processor: Processor | null = null;
private visionModel: CLIPVisionModelWithProjection | null = null;
private textModel: CLIPTextModelWithProjection | null = null;
constructor() {
super();
}
async getTokenizer() {
const { AutoTokenizer } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
if (!this.tokenizer) {
this.tokenizer = await AutoTokenizer.from_pretrained(this.modelType);
}
return this.tokenizer;
}
async getProcessor() {
const { AutoProcessor } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
if (!this.processor) {
this.processor = await AutoProcessor.from_pretrained(this.modelType);
}
return this.processor;
}
async getVisionModel() {
const { CLIPVisionModelWithProjection } = await loadTransformers(
(transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
},
);
if (!this.visionModel) {
this.visionModel = await CLIPVisionModelWithProjection.from_pretrained(
this.modelType,
);
}
return this.visionModel;
}
async getTextModel() {
const { CLIPTextModelWithProjection } = await loadTransformers(
(transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
},
);
if (!this.textModel) {
this.textModel = await CLIPTextModelWithProjection.from_pretrained(
this.modelType,
);
}
return this.textModel;
}
async getImageEmbedding(image: ImageType): Promise<number[]> {
const loadedImage = await readImage(image);
const imageInputs = await (await this.getProcessor())(loadedImage);
const { image_embeds } = await (await this.getVisionModel())(imageInputs);
return Array.from(image_embeds.data);
}
async getTextEmbedding(text: string): Promise<number[]> {
const textInputs = await (
await this.getTokenizer()
)([text], { padding: true, truncation: true });
const { text_embeds } = await (await this.getTextModel())(textInputs);
return text_embeds.data;
}
}
@@ -1,17 +0,0 @@
import { MultiModalEmbedding } from "@llamaindex/core/embeddings";
import type { ImageType } from "@llamaindex/core/schema";
/**
* Cloudflare worker doesn't support image embeddings for now
*/
export class CloudflareWorkerMultiModalEmbedding extends MultiModalEmbedding {
constructor() {
super();
}
getImageEmbedding(images: ImageType): Promise<number[]> {
throw new Error("Method not implemented.");
}
getTextEmbedding(text: string): Promise<number[]> {
throw new Error("Method not implemented.");
}
}
@@ -1,152 +1 @@
import { BaseEmbedding } from "@llamaindex/core/embeddings"; export * from "@llamaindex/deepinfra";
import type { MessageContentDetail } from "@llamaindex/core/llms";
import { extractSingleText } from "@llamaindex/core/utils";
import { getEnv } from "@llamaindex/env";
const DEFAULT_MODEL = "sentence-transformers/clip-ViT-B-32";
const API_TOKEN_ENV_VARIABLE_NAME = "DEEPINFRA_API_TOKEN";
const API_ROOT = "https://api.deepinfra.com/v1/inference";
const DEFAULT_TIMEOUT = 60 * 1000;
const DEFAULT_MAX_RETRIES = 5;
export interface DeepInfraEmbeddingResponse {
embeddings: number[][];
request_id: string;
inference_status: InferenceStatus;
}
export interface InferenceStatus {
status: string;
runtime_ms: number;
cost: number;
tokens_input: number;
}
const mapPrefixWithInputs = (prefix: string, inputs: string[]): string[] => {
return inputs.map((input) => (prefix ? `${prefix} ${input}` : input));
};
/**
* DeepInfraEmbedding is an alias for DeepInfra that implements the BaseEmbedding interface.
*/
export class DeepInfraEmbedding extends BaseEmbedding {
/**
* DeepInfra model to use
* @default "sentence-transformers/clip-ViT-B-32"
* @see https://deepinfra.com/models/embeddings
*/
model: string;
/**
* DeepInfra API token
* @see https://deepinfra.com/dash/api_keys
* If not provided, it will try to get the token from the environment variable `DEEPINFRA_API_TOKEN`
*
*/
apiToken: string;
/**
* Prefix to add to the query
* @default ""
*/
queryPrefix: string;
/**
* Prefix to add to the text
* @default ""
*/
textPrefix: string;
/**
*
* @default 5
*/
maxRetries: number;
/**
*
* @default 60 * 1000
*/
timeout: number;
constructor(init?: Partial<DeepInfraEmbedding>) {
super();
this.model = init?.model ?? DEFAULT_MODEL;
this.apiToken = init?.apiToken ?? getEnv(API_TOKEN_ENV_VARIABLE_NAME) ?? "";
this.queryPrefix = init?.queryPrefix ?? "";
this.textPrefix = init?.textPrefix ?? "";
this.maxRetries = init?.maxRetries ?? DEFAULT_MAX_RETRIES;
this.timeout = init?.timeout ?? DEFAULT_TIMEOUT;
}
async getTextEmbedding(text: string): Promise<number[]> {
const texts = mapPrefixWithInputs(this.textPrefix, [text]);
const embeddings = await this.getDeepInfraEmbedding(texts);
return embeddings[0]!;
}
async getQueryEmbedding(
query: MessageContentDetail,
): Promise<number[] | null> {
const text = extractSingleText(query);
if (text) {
const queries = mapPrefixWithInputs(this.queryPrefix, [text]);
const embeddings = await this.getDeepInfraEmbedding(queries);
return embeddings[0]!;
} else {
return null;
}
}
getTextEmbeddings = async (texts: string[]): Promise<number[][]> => {
const textsWithPrefix = mapPrefixWithInputs(this.textPrefix, texts);
return this.getDeepInfraEmbedding(textsWithPrefix);
};
async getQueryEmbeddings(queries: string[]): Promise<number[][]> {
const queriesWithPrefix = mapPrefixWithInputs(this.queryPrefix, queries);
return await this.getDeepInfraEmbedding(queriesWithPrefix);
}
private async getDeepInfraEmbedding(inputs: string[]): Promise<number[][]> {
const url = this.getUrl(this.model);
for (let attempt = 0; attempt < this.maxRetries; attempt++) {
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), this.timeout);
try {
const response = await fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${this.apiToken}`,
},
body: JSON.stringify({ inputs }),
signal: controller.signal,
});
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}
const responseJson: DeepInfraEmbeddingResponse = await response.json();
return responseJson.embeddings;
} catch (error) {
console.error(`Attempt ${attempt + 1} failed: ${error}`);
} finally {
clearTimeout(id);
}
}
throw new Error("Exceeded maximum retries");
}
private getUrl(model: string): string {
return `${API_ROOT}/${model}`;
}
}
@@ -1,110 +1 @@
import { HfInference } from "@huggingface/inference"; export * from "@llamaindex/huggingface";
import { BaseEmbedding } from "@llamaindex/core/embeddings";
import { loadTransformers } from "@llamaindex/env";
import { Settings } from "../Settings.js";
export enum HuggingFaceEmbeddingModelType {
XENOVA_ALL_MINILM_L6_V2 = "Xenova/all-MiniLM-L6-v2",
XENOVA_ALL_MPNET_BASE_V2 = "Xenova/all-mpnet-base-v2",
}
/**
* Uses feature extraction from '@xenova/transformers' to generate embeddings.
* Per default the model [XENOVA_ALL_MINILM_L6_V2](https://huggingface.co/Xenova/all-MiniLM-L6-v2) is used.
*
* Can be changed by setting the `modelType` parameter in the constructor, e.g.:
* ```
* new HuggingFaceEmbedding({
* modelType: HuggingFaceEmbeddingModelType.XENOVA_ALL_MPNET_BASE_V2,
* });
* ```
*
* @extends BaseEmbedding
*/
export class HuggingFaceEmbedding extends BaseEmbedding {
modelType: string = HuggingFaceEmbeddingModelType.XENOVA_ALL_MINILM_L6_V2;
quantized: boolean = true;
private extractor: any;
constructor(init?: Partial<HuggingFaceEmbedding>) {
super();
Object.assign(this, init);
}
async getExtractor() {
if (!this.extractor) {
const { pipeline } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
this.extractor = await pipeline("feature-extraction", this.modelType, {
quantized: this.quantized,
});
}
return this.extractor;
}
override async getTextEmbedding(text: string): Promise<number[]> {
const extractor = await this.getExtractor();
const output = await extractor(text, { pooling: "mean", normalize: true });
return Array.from(output.data);
}
}
// Workaround to get the Options type from @huggingface/inference@2.7.0
type HfInferenceOptions = ConstructorParameters<typeof HfInference>[1];
export type HFConfig = HfInferenceOptions & {
model: string;
accessToken: string;
endpoint?: string;
};
/**
* Uses feature extraction from Hugging Face's Inference API to generate embeddings.
*
* Set the `model` and `accessToken` parameter in the constructor, e.g.:
* ```
* new HuggingFaceInferenceAPIEmbedding({
* model: HuggingFaceEmbeddingModelType.XENOVA_ALL_MPNET_BASE_V2,
* accessToken: "<your-access-token>"
* });
* ```
*
* @extends BaseEmbedding
*/
export class HuggingFaceInferenceAPIEmbedding extends BaseEmbedding {
model: string;
hf: HfInference;
constructor(init: HFConfig) {
super();
const { model, accessToken, endpoint, ...hfInferenceOpts } = init;
this.hf = new HfInference(accessToken, hfInferenceOpts);
this.model = model;
if (endpoint) this.hf.endpoint(endpoint);
}
async getTextEmbedding(text: string): Promise<number[]> {
const res = await this.hf.featureExtraction({
model: this.model,
inputs: text,
});
return res as number[];
}
getTextEmbeddings = async (texts: string[]): Promise<Array<number[]>> => {
const res = await this.hf.featureExtraction({
model: this.model,
inputs: texts,
});
return res as number[][];
};
}
@@ -2,7 +2,7 @@ import { getEnv } from "@llamaindex/env";
import { OpenAIEmbedding } from "@llamaindex/openai"; import { OpenAIEmbedding } from "@llamaindex/openai";
export class FireworksEmbedding extends OpenAIEmbedding { export class FireworksEmbedding extends OpenAIEmbedding {
constructor(init?: Partial<OpenAIEmbedding>) { constructor(init?: Omit<Partial<OpenAIEmbedding>, "session">) {
const { const {
apiKey = getEnv("FIREWORKS_API_KEY"), apiKey = getEnv("FIREWORKS_API_KEY"),
additionalSessionOptions = {}, additionalSessionOptions = {},
+1 -2
View File
@@ -1,4 +1,5 @@
export * from "@llamaindex/core/embeddings"; export * from "@llamaindex/core/embeddings";
export { ClipEmbedding, ClipEmbeddingModelType } from "./ClipEmbedding.js";
export { DeepInfraEmbedding } from "./DeepInfraEmbedding.js"; export { DeepInfraEmbedding } from "./DeepInfraEmbedding.js";
export { FireworksEmbedding } from "./fireworks.js"; export { FireworksEmbedding } from "./fireworks.js";
export * from "./GeminiEmbedding.js"; export * from "./GeminiEmbedding.js";
@@ -9,5 +10,3 @@ export * from "./MixedbreadAIEmbeddings.js";
export { OllamaEmbedding } from "./OllamaEmbedding.js"; export { OllamaEmbedding } from "./OllamaEmbedding.js";
export * from "./OpenAIEmbedding.js"; export * from "./OpenAIEmbedding.js";
export { TogetherEmbedding } from "./together.js"; export { TogetherEmbedding } from "./together.js";
// ClipEmbedding might not work in non-node.js runtime, but it doesn't have side effects
export { ClipEmbedding, ClipEmbeddingModelType } from "./ClipEmbedding.js";
@@ -2,7 +2,7 @@ import { getEnv } from "@llamaindex/env";
import { OpenAIEmbedding } from "@llamaindex/openai"; import { OpenAIEmbedding } from "@llamaindex/openai";
export class TogetherEmbedding extends OpenAIEmbedding { export class TogetherEmbedding extends OpenAIEmbedding {
constructor(init?: Partial<OpenAIEmbedding>) { constructor(init?: Omit<Partial<OpenAIEmbedding>, "session">) {
const { const {
apiKey = getEnv("TOGETHER_API_KEY"), apiKey = getEnv("TOGETHER_API_KEY"),
additionalSessionOptions = {}, additionalSessionOptions = {},
@@ -14,12 +14,10 @@ export class RetrieverQueryEngine extends BaseQueryEngine {
retriever: BaseRetriever; retriever: BaseRetriever;
responseSynthesizer: BaseSynthesizer; responseSynthesizer: BaseSynthesizer;
nodePostprocessors: BaseNodePostprocessor[]; nodePostprocessors: BaseNodePostprocessor[];
preFilters?: unknown;
constructor( constructor(
retriever: BaseRetriever, retriever: BaseRetriever,
responseSynthesizer?: BaseSynthesizer, responseSynthesizer?: BaseSynthesizer,
preFilters?: unknown,
nodePostprocessors?: BaseNodePostprocessor[], nodePostprocessors?: BaseNodePostprocessor[],
) { ) {
super(async (strOrQueryBundle, stream) => { super(async (strOrQueryBundle, stream) => {
@@ -52,7 +50,6 @@ export class RetrieverQueryEngine extends BaseQueryEngine {
this.retriever = retriever; this.retriever = retriever;
this.responseSynthesizer = this.responseSynthesizer =
responseSynthesizer || getResponseSynthesizer("compact"); responseSynthesizer || getResponseSynthesizer("compact");
this.preFilters = preFilters;
this.nodePostprocessors = nodePostprocessors || []; this.nodePostprocessors = nodePostprocessors || [];
} }
@@ -1,14 +1,20 @@
import type { LLM } from "@llamaindex/core/llms"; import type { LLM } from "@llamaindex/core/llms";
import {
PromptTemplate,
defaultKeywordExtractPrompt,
defaultQuestionExtractPrompt,
defaultSummaryPrompt,
defaultTitleCombinePromptTemplate,
defaultTitleExtractorPromptTemplate,
type KeywordExtractPrompt,
type QuestionExtractPrompt,
type SummaryPrompt,
type TitleCombinePrompt,
type TitleExtractorPrompt,
} from "@llamaindex/core/prompts";
import type { BaseNode } from "@llamaindex/core/schema"; import type { BaseNode } from "@llamaindex/core/schema";
import { MetadataMode, TextNode } from "@llamaindex/core/schema"; import { MetadataMode, TextNode } from "@llamaindex/core/schema";
import { OpenAI } from "@llamaindex/openai"; import { OpenAI } from "@llamaindex/openai";
import {
defaultKeywordExtractorPromptTemplate,
defaultQuestionAnswerPromptTemplate,
defaultSummaryExtractorPromptTemplate,
defaultTitleCombinePromptTemplate,
defaultTitleExtractorPromptTemplate,
} from "./prompts.js";
import { BaseExtractor } from "./types.js"; import { BaseExtractor } from "./types.js";
const STRIP_REGEX = /(\r\n|\n|\r)/gm; const STRIP_REGEX = /(\r\n|\n|\r)/gm;
@@ -16,6 +22,7 @@ const STRIP_REGEX = /(\r\n|\n|\r)/gm;
type KeywordExtractArgs = { type KeywordExtractArgs = {
llm?: LLM; llm?: LLM;
keywords?: number; keywords?: number;
promptTemplate?: KeywordExtractPrompt["template"];
}; };
type ExtractKeyword = { type ExtractKeyword = {
@@ -39,6 +46,12 @@ export class KeywordExtractor extends BaseExtractor {
*/ */
keywords: number = 5; keywords: number = 5;
/**
* The prompt template to use for the question extractor.
* @type {string}
*/
promptTemplate: KeywordExtractPrompt;
/** /**
* Constructor for the KeywordExtractor class. * Constructor for the KeywordExtractor class.
* @param {LLM} llm LLM instance. * @param {LLM} llm LLM instance.
@@ -53,6 +66,12 @@ export class KeywordExtractor extends BaseExtractor {
this.llm = options?.llm ?? new OpenAI(); this.llm = options?.llm ?? new OpenAI();
this.keywords = options?.keywords ?? 5; this.keywords = options?.keywords ?? 5;
this.promptTemplate = options?.promptTemplate
? new PromptTemplate({
templateVars: ["context", "maxKeywords"],
template: options.promptTemplate,
})
: defaultKeywordExtractPrompt;
} }
/** /**
@@ -66,9 +85,9 @@ export class KeywordExtractor extends BaseExtractor {
} }
const completion = await this.llm.complete({ const completion = await this.llm.complete({
prompt: defaultKeywordExtractorPromptTemplate({ prompt: this.promptTemplate.format({
contextStr: node.getContent(MetadataMode.ALL), context: node.getContent(MetadataMode.ALL),
keywords: this.keywords, maxKeywords: this.keywords.toString(),
}), }),
}); });
@@ -93,8 +112,8 @@ export class KeywordExtractor extends BaseExtractor {
type TitleExtractorsArgs = { type TitleExtractorsArgs = {
llm?: LLM; llm?: LLM;
nodes?: number; nodes?: number;
nodeTemplate?: string; nodeTemplate?: TitleExtractorPrompt["template"];
combineTemplate?: string; combineTemplate?: TitleCombinePrompt["template"];
}; };
type ExtractTitle = { type ExtractTitle = {
@@ -129,19 +148,19 @@ export class TitleExtractor extends BaseExtractor {
* The prompt template to use for the title extractor. * The prompt template to use for the title extractor.
* @type {string} * @type {string}
*/ */
nodeTemplate: string; nodeTemplate: TitleExtractorPrompt;
/** /**
* The prompt template to merge title with.. * The prompt template to merge title with..
* @type {string} * @type {string}
*/ */
combineTemplate: string; combineTemplate: TitleCombinePrompt;
/** /**
* Constructor for the TitleExtractor class. * Constructor for the TitleExtractor class.
* @param {LLM} llm LLM instance. * @param {LLM} llm LLM instance.
* @param {number} nodes Number of nodes to extract titles from. * @param {number} nodes Number of nodes to extract titles from.
* @param {string} nodeTemplate The prompt template to use for the title extractor. * @param {TitleExtractorPrompt} nodeTemplate The prompt template to use for the title extractor.
* @param {string} combineTemplate The prompt template to merge title with.. * @param {string} combineTemplate The prompt template to merge title with..
*/ */
constructor(options?: TitleExtractorsArgs) { constructor(options?: TitleExtractorsArgs) {
@@ -150,10 +169,19 @@ export class TitleExtractor extends BaseExtractor {
this.llm = options?.llm ?? new OpenAI(); this.llm = options?.llm ?? new OpenAI();
this.nodes = options?.nodes ?? 5; this.nodes = options?.nodes ?? 5;
this.nodeTemplate = this.nodeTemplate = options?.nodeTemplate
options?.nodeTemplate ?? defaultTitleExtractorPromptTemplate(); ? new PromptTemplate({
this.combineTemplate = templateVars: ["context"],
options?.combineTemplate ?? defaultTitleCombinePromptTemplate(); template: options.nodeTemplate,
})
: defaultTitleExtractorPromptTemplate;
this.combineTemplate = options?.combineTemplate
? new PromptTemplate({
templateVars: ["context"],
template: options.combineTemplate,
})
: defaultTitleCombinePromptTemplate;
} }
/** /**
@@ -218,8 +246,8 @@ export class TitleExtractor extends BaseExtractor {
const titleCandidates = await this.getTitlesCandidates(nodes); const titleCandidates = await this.getTitlesCandidates(nodes);
const combinedTitles = titleCandidates.join(", "); const combinedTitles = titleCandidates.join(", ");
const completion = await this.llm.complete({ const completion = await this.llm.complete({
prompt: defaultTitleCombinePromptTemplate({ prompt: this.combineTemplate.format({
contextStr: combinedTitles, context: combinedTitles,
}), }),
}); });
@@ -232,8 +260,8 @@ export class TitleExtractor extends BaseExtractor {
private async getTitlesCandidates(nodes: BaseNode[]): Promise<string[]> { private async getTitlesCandidates(nodes: BaseNode[]): Promise<string[]> {
const titleJobs = nodes.map(async (node) => { const titleJobs = nodes.map(async (node) => {
const completion = await this.llm.complete({ const completion = await this.llm.complete({
prompt: defaultTitleExtractorPromptTemplate({ prompt: this.nodeTemplate.format({
contextStr: node.getContent(MetadataMode.ALL), context: node.getContent(MetadataMode.ALL),
}), }),
}); });
@@ -247,7 +275,7 @@ export class TitleExtractor extends BaseExtractor {
type QuestionAnswerExtractArgs = { type QuestionAnswerExtractArgs = {
llm?: LLM; llm?: LLM;
questions?: number; questions?: number;
promptTemplate?: string; promptTemplate?: QuestionExtractPrompt["template"];
embeddingOnly?: boolean; embeddingOnly?: boolean;
}; };
@@ -276,7 +304,7 @@ export class QuestionsAnsweredExtractor extends BaseExtractor {
* The prompt template to use for the question extractor. * The prompt template to use for the question extractor.
* @type {string} * @type {string}
*/ */
promptTemplate: string; promptTemplate: QuestionExtractPrompt;
/** /**
* Wheter to use metadata for embeddings only * Wheter to use metadata for embeddings only
@@ -289,7 +317,7 @@ export class QuestionsAnsweredExtractor extends BaseExtractor {
* Constructor for the QuestionsAnsweredExtractor class. * Constructor for the QuestionsAnsweredExtractor class.
* @param {LLM} llm LLM instance. * @param {LLM} llm LLM instance.
* @param {number} questions Number of questions to generate. * @param {number} questions Number of questions to generate.
* @param {string} promptTemplate The prompt template to use for the question extractor. * @param {TextQAPrompt} promptTemplate The prompt template to use for the question extractor.
* @param {boolean} embeddingOnly Wheter to use metadata for embeddings only. * @param {boolean} embeddingOnly Wheter to use metadata for embeddings only.
*/ */
constructor(options?: QuestionAnswerExtractArgs) { constructor(options?: QuestionAnswerExtractArgs) {
@@ -300,12 +328,14 @@ export class QuestionsAnsweredExtractor extends BaseExtractor {
this.llm = options?.llm ?? new OpenAI(); this.llm = options?.llm ?? new OpenAI();
this.questions = options?.questions ?? 5; this.questions = options?.questions ?? 5;
this.promptTemplate = this.promptTemplate = options?.promptTemplate
options?.promptTemplate ?? ? new PromptTemplate({
defaultQuestionAnswerPromptTemplate({ templateVars: ["numQuestions", "context"],
numQuestions: this.questions, template: options.promptTemplate,
contextStr: "", }).partialFormat({
}); numQuestions: "5",
})
: defaultQuestionExtractPrompt;
this.embeddingOnly = options?.embeddingOnly ?? false; this.embeddingOnly = options?.embeddingOnly ?? false;
} }
@@ -323,9 +353,9 @@ export class QuestionsAnsweredExtractor extends BaseExtractor {
const contextStr = node.getContent(this.metadataMode); const contextStr = node.getContent(this.metadataMode);
const prompt = defaultQuestionAnswerPromptTemplate({ const prompt = this.promptTemplate.format({
contextStr, context: contextStr,
numQuestions: this.questions, numQuestions: this.questions.toString(),
}); });
const questions = await this.llm.complete({ const questions = await this.llm.complete({
@@ -356,7 +386,7 @@ export class QuestionsAnsweredExtractor extends BaseExtractor {
type SummaryExtractArgs = { type SummaryExtractArgs = {
llm?: LLM; llm?: LLM;
summaries?: string[]; summaries?: string[];
promptTemplate?: string; promptTemplate?: SummaryPrompt["template"];
}; };
type ExtractSummary = { type ExtractSummary = {
@@ -385,7 +415,7 @@ export class SummaryExtractor extends BaseExtractor {
* The prompt template to use for the summary extractor. * The prompt template to use for the summary extractor.
* @type {string} * @type {string}
*/ */
promptTemplate: string; promptTemplate: SummaryPrompt;
private selfSummary: boolean; private selfSummary: boolean;
private prevSummary: boolean; private prevSummary: boolean;
@@ -404,8 +434,12 @@ export class SummaryExtractor extends BaseExtractor {
this.llm = options?.llm ?? new OpenAI(); this.llm = options?.llm ?? new OpenAI();
this.summaries = summaries; this.summaries = summaries;
this.promptTemplate = this.promptTemplate = options?.promptTemplate
options?.promptTemplate ?? defaultSummaryExtractorPromptTemplate(); ? new PromptTemplate({
templateVars: ["context"],
template: options.promptTemplate,
})
: defaultSummaryPrompt;
this.selfSummary = summaries?.includes("self") ?? false; this.selfSummary = summaries?.includes("self") ?? false;
this.prevSummary = summaries?.includes("prev") ?? false; this.prevSummary = summaries?.includes("prev") ?? false;
@@ -422,10 +456,10 @@ export class SummaryExtractor extends BaseExtractor {
return ""; return "";
} }
const contextStr = node.getContent(this.metadataMode); const context = node.getContent(this.metadataMode);
const prompt = defaultSummaryExtractorPromptTemplate({ const prompt = this.promptTemplate.format({
contextStr, context,
}); });
const summary = await this.llm.complete({ const summary = await this.llm.complete({
@@ -1,74 +0,0 @@
export interface DefaultPromptTemplate {
contextStr: string;
}
export interface DefaultKeywordExtractorPromptTemplate
extends DefaultPromptTemplate {
keywords: number;
}
export interface DefaultQuestionAnswerPromptTemplate
extends DefaultPromptTemplate {
numQuestions: number;
}
export interface DefaultNodeTextTemplate {
metadataStr: string;
content: string;
}
export const defaultKeywordExtractorPromptTemplate = ({
contextStr = "",
keywords = 5,
}: DefaultKeywordExtractorPromptTemplate) => `${contextStr}
Give ${keywords} unique keywords for this document.
Format as comma separated.
Keywords: `;
export const defaultTitleExtractorPromptTemplate = (
{ contextStr = "" }: DefaultPromptTemplate = {
contextStr: "",
},
) => `${contextStr}
Give a title that summarizes all of the unique entities, titles or themes found in the context.
Title: `;
export const defaultTitleCombinePromptTemplate = (
{ contextStr = "" }: DefaultPromptTemplate = {
contextStr: "",
},
) => `${contextStr}
Based on the above candidate titles and contents, what is the comprehensive title for this document?
Title: `;
export const defaultQuestionAnswerPromptTemplate = (
{ contextStr = "", numQuestions = 5 }: DefaultQuestionAnswerPromptTemplate = {
contextStr: "",
numQuestions: 5,
},
) => `${contextStr}
Given the contextual informations, generate ${numQuestions} questions this context can provides specific answers to which are unlikely to be found else where. Higher-level summaries of surrounding context may be provideds as well.
Try using these summaries to generate better questions that this context can answer.
`;
export const defaultSummaryExtractorPromptTemplate = (
{ contextStr = "" }: DefaultPromptTemplate = {
contextStr: "",
},
) => `${contextStr}
Summarize the key topics and entities of the sections.
Summary: `;
export const defaultNodeTextTemplate = ({
metadataStr = "",
content = "",
}: {
metadataStr?: string;
content?: string;
} = {}) => `[Excerpt from document]
${metadataStr}
Excerpt:
-----
${content}
-----
`;
+2 -2
View File
@@ -1,10 +1,10 @@
import { defaultNodeTextTemplate } from "@llamaindex/core/prompts";
import { import {
BaseNode, BaseNode,
MetadataMode, MetadataMode,
TextNode, TextNode,
TransformComponent, TransformComponent,
} from "@llamaindex/core/schema"; } from "@llamaindex/core/schema";
import { defaultNodeTextTemplate } from "./prompts.js";
/* /*
* Abstract class for all extractors. * Abstract class for all extractors.
@@ -71,7 +71,7 @@ export abstract class BaseExtractor extends TransformComponent {
if (newNodes[idx] instanceof TextNode) { if (newNodes[idx] instanceof TextNode) {
newNodes[idx] = new TextNode({ newNodes[idx] = new TextNode({
...newNodes[idx], ...newNodes[idx],
textTemplate: defaultNodeTextTemplate(), textTemplate: defaultNodeTextTemplate.format(),
}); });
} }
} }
+14 -2
View File
@@ -1,3 +1,15 @@
//#region initial setup for OpenAI
import { OpenAI } from "@llamaindex/openai";
import { Settings } from "./Settings.js";
try {
Settings.llm;
} catch {
Settings.llm = new OpenAI();
}
//#endregion
export { export {
LlamaParseReader, LlamaParseReader,
type Language, type Language,
@@ -28,12 +40,12 @@ export type {
JSONArray, JSONArray,
JSONObject, JSONObject,
JSONValue, JSONValue,
LlamaIndexEventMaps,
LLMEndEvent, LLMEndEvent,
LLMStartEvent, LLMStartEvent,
LLMStreamEvent, LLMStreamEvent,
LLMToolCallEvent, LLMToolCallEvent,
LLMToolResultEvent, LLMToolResultEvent,
LlamaIndexEventMaps,
} from "@llamaindex/core/global"; } from "@llamaindex/core/global";
export * from "@llamaindex/core/indices"; export * from "@llamaindex/core/indices";
export * from "@llamaindex/core/llms"; export * from "@llamaindex/core/llms";
@@ -61,7 +73,7 @@ export * from "./postprocessors/index.js";
export * from "./QuestionGenerator.js"; export * from "./QuestionGenerator.js";
export * from "./selectors/index.js"; export * from "./selectors/index.js";
export * from "./ServiceContext.js"; export * from "./ServiceContext.js";
export { Settings } from "./Settings.js";
export * from "./storage/StorageContext.js"; export * from "./storage/StorageContext.js";
export * from "./tools/index.js"; export * from "./tools/index.js";
export * from "./types.js"; export * from "./types.js";
export { Settings };
@@ -8,39 +8,6 @@ import { runTransformations } from "../ingestion/IngestionPipeline.js";
import type { StorageContext } from "../storage/StorageContext.js"; import type { StorageContext } from "../storage/StorageContext.js";
import type { BaseDocumentStore } from "../storage/docStore/types.js"; import type { BaseDocumentStore } from "../storage/docStore/types.js";
import type { BaseIndexStore } from "../storage/indexStore/types.js"; import type { BaseIndexStore } from "../storage/indexStore/types.js";
import { IndexStruct } from "./IndexStruct.js";
import { IndexStructType } from "./json-to-index-struct.js";
// A table of keywords mapping keywords to text chunks.
export class KeywordTable extends IndexStruct {
table: Map<string, Set<string>> = new Map();
type: IndexStructType = IndexStructType.KEYWORD_TABLE;
addNode(keywords: string[], nodeId: string): void {
keywords.forEach((keyword) => {
if (!this.table.has(keyword)) {
this.table.set(keyword, new Set());
}
this.table.get(keyword)!.add(nodeId);
});
}
deleteNode(keywords: string[], nodeId: string) {
keywords.forEach((keyword) => {
if (this.table.has(keyword)) {
this.table.get(keyword)!.delete(nodeId);
}
});
}
toJson(): Record<string, unknown> {
return {
...super.toJson(),
table: this.table,
type: this.type,
};
}
}
export interface BaseIndexInit<T> { export interface BaseIndexInit<T> {
serviceContext?: ServiceContext | undefined; serviceContext?: ServiceContext | undefined;
@@ -13,7 +13,7 @@ import type { StorageContext } from "../../storage/StorageContext.js";
import { storageContextFromDefaults } from "../../storage/StorageContext.js"; import { storageContextFromDefaults } from "../../storage/StorageContext.js";
import type { BaseDocumentStore } from "../../storage/docStore/types.js"; import type { BaseDocumentStore } from "../../storage/docStore/types.js";
import type { BaseIndexInit } from "../BaseIndex.js"; import type { BaseIndexInit } from "../BaseIndex.js";
import { BaseIndex, KeywordTable } from "../BaseIndex.js"; import { BaseIndex } from "../BaseIndex.js";
import { IndexStructType } from "../json-to-index-struct.js"; import { IndexStructType } from "../json-to-index-struct.js";
import { import {
extractKeywordsGivenResponse, extractKeywordsGivenResponse,
@@ -21,6 +21,7 @@ import {
simpleExtractKeywords, simpleExtractKeywords,
} from "./utils.js"; } from "./utils.js";
import { KeywordTable } from "@llamaindex/core/data-structs";
import type { LLM } from "@llamaindex/core/llms"; import type { LLM } from "@llamaindex/core/llms";
import { import {
defaultKeywordExtractPrompt, defaultKeywordExtractPrompt,
@@ -246,7 +247,6 @@ export class KeywordTableIndex extends BaseIndex<KeywordTable> {
return new RetrieverQueryEngine( return new RetrieverQueryEngine(
retriever ?? this.asRetriever(), retriever ?? this.asRetriever(),
responseSynthesizer, responseSynthesizer,
options?.preFilters,
options?.nodePostprocessors, options?.nodePostprocessors,
); );
} }
@@ -189,7 +189,6 @@ export class SummaryIndex extends BaseIndex<IndexList> {
return new RetrieverQueryEngine( return new RetrieverQueryEngine(
retriever, retriever,
responseSynthesizer, responseSynthesizer,
options?.preFilters,
options?.nodePostprocessors, options?.nodePostprocessors,
); );
} }
@@ -31,8 +31,8 @@ import type { StorageContext } from "../../storage/StorageContext.js";
import { storageContextFromDefaults } from "../../storage/StorageContext.js"; import { storageContextFromDefaults } from "../../storage/StorageContext.js";
import type { BaseIndexStore } from "../../storage/indexStore/types.js"; import type { BaseIndexStore } from "../../storage/indexStore/types.js";
import type { import type {
BaseVectorStore,
MetadataFilters, MetadataFilters,
VectorStore,
VectorStoreByType, VectorStoreByType,
VectorStoreQueryResult, VectorStoreQueryResult,
} from "../../vector-store/index.js"; } from "../../vector-store/index.js";
@@ -264,7 +264,7 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
} }
static async fromVectorStore( static async fromVectorStore(
vectorStore: VectorStore, vectorStore: BaseVectorStore,
serviceContext?: ServiceContext, serviceContext?: ServiceContext,
) { ) {
return this.fromVectorStores( return this.fromVectorStores(
@@ -298,9 +298,8 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
similarityTopK, similarityTopK,
} = options ?? {}; } = options ?? {};
return new RetrieverQueryEngine( return new RetrieverQueryEngine(
retriever ?? this.asRetriever({ similarityTopK }), retriever ?? this.asRetriever({ similarityTopK, filters: preFilters }),
responseSynthesizer, responseSynthesizer,
preFilters,
nodePostprocessors, nodePostprocessors,
); );
} }
@@ -308,7 +307,7 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
protected async insertNodesToStore( protected async insertNodesToStore(
newIds: string[], newIds: string[],
nodes: BaseNode[], nodes: BaseNode[],
vectorStore: VectorStore, vectorStore: BaseVectorStore,
): Promise<void> { ): Promise<void> {
// NOTE: if the vector store doesn't store text, // NOTE: if the vector store doesn't store text,
// we need to add the nodes to the index struct and document store // we need to add the nodes to the index struct and document store
@@ -358,7 +357,7 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
} }
protected async deleteRefDocFromStore( protected async deleteRefDocFromStore(
vectorStore: VectorStore, vectorStore: BaseVectorStore,
refDocId: string, refDocId: string,
): Promise<void> { ): Promise<void> {
await vectorStore.delete(refDocId); await vectorStore.delete(refDocId);
@@ -387,7 +386,7 @@ export type VectorIndexRetrieverOptions = {
index: VectorStoreIndex; index: VectorStoreIndex;
similarityTopK?: number | undefined; similarityTopK?: number | undefined;
topK?: TopKMap | undefined; topK?: TopKMap | undefined;
filters?: MetadataFilters; filters?: MetadataFilters | undefined;
}; };
export class VectorIndexRetriever extends BaseRetriever { export class VectorIndexRetriever extends BaseRetriever {
@@ -426,7 +425,7 @@ export class VectorIndexRetriever extends BaseRetriever {
let nodesWithScores: NodeWithScore[] = []; let nodesWithScores: NodeWithScore[] = [];
for (const type in vectorStores) { for (const type in vectorStores) {
const vectorStore: VectorStore = vectorStores[type as ModalityType]!; const vectorStore: BaseVectorStore = vectorStores[type as ModalityType]!;
nodesWithScores = nodesWithScores.concat( nodesWithScores = nodesWithScores.concat(
await this.retrieveQuery(query, type as ModalityType, vectorStore), await this.retrieveQuery(query, type as ModalityType, vectorStore),
); );
@@ -437,7 +436,7 @@ export class VectorIndexRetriever extends BaseRetriever {
protected async retrieveQuery( protected async retrieveQuery(
query: MessageContent, query: MessageContent,
type: ModalityType, type: ModalityType,
vectorStore: VectorStore, vectorStore: BaseVectorStore,
filters?: MetadataFilters, filters?: MetadataFilters,
): Promise<NodeWithScore[]> { ): Promise<NodeWithScore[]> {
// convert string message to multi-modal format // convert string message to multi-modal format
@@ -7,7 +7,10 @@ import {
type Metadata, type Metadata,
} from "@llamaindex/core/schema"; } from "@llamaindex/core/schema";
import type { BaseDocumentStore } from "../storage/docStore/types.js"; import type { BaseDocumentStore } from "../storage/docStore/types.js";
import type { VectorStore, VectorStoreByType } from "../vector-store/types.js"; import type {
BaseVectorStore,
VectorStoreByType,
} from "../vector-store/types.js";
import { IngestionCache, getTransformationHash } from "./IngestionCache.js"; import { IngestionCache, getTransformationHash } from "./IngestionCache.js";
import { import {
DocStoreStrategy, DocStoreStrategy,
@@ -59,7 +62,7 @@ export class IngestionPipeline {
transformations: TransformComponent[] = []; transformations: TransformComponent[] = [];
documents?: Document[] | undefined; documents?: Document[] | undefined;
reader?: BaseReader | undefined; reader?: BaseReader | undefined;
vectorStore?: VectorStore | undefined; vectorStore?: BaseVectorStore | undefined;
vectorStores?: VectorStoreByType | undefined; vectorStores?: VectorStoreByType | undefined;
docStore?: BaseDocumentStore; docStore?: BaseDocumentStore;
docStoreStrategy: DocStoreStrategy = DocStoreStrategy.UPSERTS; docStoreStrategy: DocStoreStrategy = DocStoreStrategy.UPSERTS;
@@ -133,7 +136,7 @@ export async function addNodesToVectorStores(
nodesAdded?: ( nodesAdded?: (
newIds: string[], newIds: string[],
nodes: BaseNode<Metadata>[], nodes: BaseNode<Metadata>[],
vectorStore: VectorStore, vectorStore: BaseVectorStore,
) => Promise<void>, ) => Promise<void>,
) { ) {
const nodeMap = splitNodesByType(nodes); const nodeMap = splitNodesByType(nodes);
@@ -1,6 +1,6 @@
import { BaseNode, TransformComponent } from "@llamaindex/core/schema"; import { BaseNode, TransformComponent } from "@llamaindex/core/schema";
import type { BaseDocumentStore } from "../../storage/docStore/types.js"; import type { BaseDocumentStore } from "../../storage/docStore/types.js";
import type { VectorStore } from "../../vector-store/types.js"; import type { BaseVectorStore } from "../../vector-store/types.js";
import { classify } from "./classify.js"; import { classify } from "./classify.js";
/** /**
@@ -9,9 +9,9 @@ import { classify } from "./classify.js";
*/ */
export class UpsertsAndDeleteStrategy extends TransformComponent { export class UpsertsAndDeleteStrategy extends TransformComponent {
protected docStore: BaseDocumentStore; protected docStore: BaseDocumentStore;
protected vectorStores: VectorStore[] | undefined; protected vectorStores: BaseVectorStore[] | undefined;
constructor(docStore: BaseDocumentStore, vectorStores?: VectorStore[]) { constructor(docStore: BaseDocumentStore, vectorStores?: BaseVectorStore[]) {
super(async (nodes: BaseNode[]): Promise<BaseNode[]> => { super(async (nodes: BaseNode[]): Promise<BaseNode[]> => {
const { dedupedNodes, missingDocs, unusedDocs } = await classify( const { dedupedNodes, missingDocs, unusedDocs } = await classify(
this.docStore, this.docStore,
@@ -1,6 +1,6 @@
import { BaseNode, TransformComponent } from "@llamaindex/core/schema"; import { BaseNode, TransformComponent } from "@llamaindex/core/schema";
import type { BaseDocumentStore } from "../../storage/docStore/types.js"; import type { BaseDocumentStore } from "../../storage/docStore/types.js";
import type { VectorStore } from "../../vector-store/types.js"; import type { BaseVectorStore } from "../../vector-store/types.js";
import { classify } from "./classify.js"; import { classify } from "./classify.js";
/** /**
@@ -8,9 +8,9 @@ import { classify } from "./classify.js";
*/ */
export class UpsertsStrategy extends TransformComponent { export class UpsertsStrategy extends TransformComponent {
protected docStore: BaseDocumentStore; protected docStore: BaseDocumentStore;
protected vectorStores: VectorStore[] | undefined; protected vectorStores: BaseVectorStore[] | undefined;
constructor(docStore: BaseDocumentStore, vectorStores?: VectorStore[]) { constructor(docStore: BaseDocumentStore, vectorStores?: BaseVectorStore[]) {
super(async (nodes: BaseNode[]): Promise<BaseNode[]> => { super(async (nodes: BaseNode[]): Promise<BaseNode[]> => {
const { dedupedNodes, unusedDocs } = await classify(this.docStore, nodes); const { dedupedNodes, unusedDocs } = await classify(this.docStore, nodes);
// remove unused docs // remove unused docs
@@ -1,6 +1,6 @@
import { TransformComponent } from "@llamaindex/core/schema"; import { TransformComponent } from "@llamaindex/core/schema";
import type { BaseDocumentStore } from "../../storage/docStore/types.js"; import type { BaseDocumentStore } from "../../storage/docStore/types.js";
import type { VectorStore } from "../../vector-store/types.js"; import type { BaseVectorStore } from "../../vector-store/types.js";
import { DuplicatesStrategy } from "./DuplicatesStrategy.js"; import { DuplicatesStrategy } from "./DuplicatesStrategy.js";
import { UpsertsAndDeleteStrategy } from "./UpsertsAndDeleteStrategy.js"; import { UpsertsAndDeleteStrategy } from "./UpsertsAndDeleteStrategy.js";
import { UpsertsStrategy } from "./UpsertsStrategy.js"; import { UpsertsStrategy } from "./UpsertsStrategy.js";
@@ -28,7 +28,7 @@ class NoOpStrategy extends TransformComponent {
export function createDocStoreStrategy( export function createDocStoreStrategy(
docStoreStrategy: DocStoreStrategy, docStoreStrategy: DocStoreStrategy,
docStore?: BaseDocumentStore, docStore?: BaseDocumentStore,
vectorStores: VectorStore[] = [], vectorStores: BaseVectorStore[] = [],
): TransformComponent { ): TransformComponent {
if (docStoreStrategy === DocStoreStrategy.NONE) { if (docStoreStrategy === DocStoreStrategy.NONE) {
return new NoOpStrategy(); return new NoOpStrategy();
-305
View File
@@ -1,305 +0,0 @@
type Status = "starting" | "processing" | "succeeded" | "failed" | "canceled";
type Visibility = "public" | "private";
type WebhookEventType = "start" | "output" | "logs" | "completed";
export interface ApiError extends Error {
request: Request;
response: Response;
}
export interface Account {
type: "user" | "organization";
username: string;
name: string;
github_url?: string;
}
export interface Collection {
name: string;
slug: string;
description: string;
models?: Model[];
}
export interface Deployment {
owner: string;
name: string;
current_release: {
number: number;
model: string;
version: string;
created_at: string;
created_by: Account;
configuration: {
hardware: string;
min_instances: number;
max_instances: number;
};
};
}
export interface Hardware {
sku: string;
name: string;
}
export interface Model {
url: string;
owner: string;
name: string;
description?: string;
visibility: "public" | "private";
github_url?: string;
paper_url?: string;
license_url?: string;
run_count: number;
cover_image_url?: string;
default_example?: Prediction;
latest_version?: ModelVersion;
}
export interface ModelVersion {
id: string;
created_at: string;
cog_version: string;
openapi_schema: object;
}
export interface Prediction {
id: string;
status: Status;
model: string;
version: string;
input: object;
output?: any;
source: "api" | "web";
error?: any;
logs?: string;
metrics?: {
predict_time?: number;
};
webhook?: string;
webhook_events_filter?: WebhookEventType[];
created_at: string;
started_at?: string;
completed_at?: string;
urls: {
get: string;
cancel: string;
stream?: string;
};
}
export type Training = Prediction;
export interface Page<T> {
previous?: string;
next?: string;
results: T[];
}
export interface ServerSentEvent {
event: string;
data: string;
id?: string;
retry?: number;
}
export interface WebhookSecret {
key: string;
}
export default class Replicate {
constructor(options?: {
auth?: string;
userAgent?: string;
baseUrl?: string;
fetch?: (input: Request | string, init?: RequestInit) => Promise<Response>;
});
auth: string;
userAgent?: string;
baseUrl?: string;
fetch: (input: Request | string, init?: RequestInit) => Promise<Response>;
run(
identifier: `${string}/${string}` | `${string}/${string}:${string}`,
options: {
input: object;
wait?: { interval?: number };
webhook?: string;
webhook_events_filter?: WebhookEventType[];
signal?: AbortSignal;
},
progress?: (prediction: Prediction) => void,
): Promise<object>;
stream(
identifier: `${string}/${string}` | `${string}/${string}:${string}`,
options: {
input: object;
webhook?: string;
webhook_events_filter?: WebhookEventType[];
signal?: AbortSignal;
},
): AsyncGenerator<ServerSentEvent>;
request(
route: string | URL,
options: {
method?: string;
headers?: object | Headers;
params?: object;
data?: object;
},
): Promise<Response>;
paginate<T>(endpoint: () => Promise<Page<T>>): AsyncGenerator<[T]>;
wait(
prediction: Prediction,
options?: {
interval?: number;
},
stop?: (prediction: Prediction) => Promise<boolean>,
): Promise<Prediction>;
accounts: {
current(): Promise<Account>;
};
collections: {
list(): Promise<Page<Collection>>;
get(collection_slug: string): Promise<Collection>;
};
deployments: {
predictions: {
create(
deployment_owner: string,
deployment_name: string,
options: {
input: object;
stream?: boolean;
webhook?: string;
webhook_events_filter?: WebhookEventType[];
},
): Promise<Prediction>;
};
get(deployment_owner: string, deployment_name: string): Promise<Deployment>;
create(deployment_config: {
name: string;
model: string;
version: string;
hardware: string;
min_instances: number;
max_instances: number;
}): Promise<Deployment>;
update(
deployment_owner: string,
deployment_name: string,
deployment_config: {
version?: string;
hardware?: string;
min_instances?: number;
max_instances?: number;
} & (
| { version: string }
| { hardware: string }
| { min_instances: number }
| { max_instances: number }
),
): Promise<Deployment>;
list(): Promise<Page<Deployment>>;
};
hardware: {
list(): Promise<Hardware[]>;
};
models: {
get(model_owner: string, model_name: string): Promise<Model>;
list(): Promise<Page<Model>>;
create(
model_owner: string,
model_name: string,
options: {
visibility: Visibility;
hardware: string;
description?: string;
github_url?: string;
paper_url?: string;
license_url?: string;
cover_image_url?: string;
},
): Promise<Model>;
versions: {
list(model_owner: string, model_name: string): Promise<ModelVersion[]>;
get(
model_owner: string,
model_name: string,
version_id: string,
): Promise<ModelVersion>;
};
};
predictions: {
create(
options: {
model?: string;
version?: string;
input: object;
stream?: boolean;
webhook?: string;
webhook_events_filter?: WebhookEventType[];
} & ({ version: string } | { model: string }),
): Promise<Prediction>;
get(prediction_id: string): Promise<Prediction>;
cancel(prediction_id: string): Promise<Prediction>;
list(): Promise<Page<Prediction>>;
};
trainings: {
create(
model_owner: string,
model_name: string,
version_id: string,
options: {
destination: `${string}/${string}`;
input: object;
webhook?: string;
webhook_events_filter?: WebhookEventType[];
},
): Promise<Training>;
get(training_id: string): Promise<Training>;
cancel(training_id: string): Promise<Training>;
list(): Promise<Page<Training>>;
};
webhooks: {
default: {
secret: {
get(): Promise<WebhookSecret>;
};
};
};
}
export function validateWebhook(
requestData:
| Request
| {
id?: string;
timestamp?: string;
body: string;
secret?: string;
signature?: string;
},
secret: string,
): Promise<boolean>;
export function parseProgressFromLogs(logs: Prediction | string): {
percentage: number;
current: number;
total: number;
} | null;

Some files were not shown because too many files have changed in this diff Show More