Compare commits

...

10 Commits

Author SHA1 Message Date
Alex Yang 65958b2c2f ci: fix 2025-02-12 21:12:41 +08:00
Alex Yang 6f3bf1b91f chore: package.json repository url 2025-02-12 21:05:34 +08:00
Marcus Schiesser f4588bc770 chore: Remove readers package from llamaindex (#1649) 2025-02-12 17:16:41 +07:00
Marcus Schiesser b49037612d remove service context (#1618)
Co-authored-by: thucpn <thucsh2@gmail.com>
2025-02-12 15:10:11 +07:00
Thuc Pham a87efb91a4 docs: update chat engine docs (#1648) 2025-02-12 12:45:26 +07:00
Thuc Pham 6a4a73760b chore: remove re-exporting packages in llamaindex (#1624)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2025-02-12 12:44:52 +07:00
Alex Yang 1564831158 ci: fix pkg-pr-new release (#1646) 2025-02-11 22:42:42 +08:00
Alex Yang 4d94f6e50d test: smoke test with cjs/esm dual package (#1644) 2025-02-11 15:02:06 +08:00
Thuc Pham 7bd5d9340c docs: update workflow doc (#1637)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2025-02-11 13:41:11 +07:00
Thuc Pham d924c63162 feat: asChatEngine function for index (#1640) 2025-02-11 12:57:15 +07:00
174 changed files with 5190 additions and 7570 deletions
+16
View File
@@ -0,0 +1,16 @@
---
"@llamaindex/milvus": minor
"@llamaindex/qdrant": minor
"@llamaindex/next-node-runtime-test": minor
"@llamaindex/azure": minor
"@llamaindex/cloudflare-hono": minor
"@llamaindex/anthropic": minor
"@llamaindex/llamaindex-test": minor
"llamaindex": minor
"@llamaindex/core": minor
"@llamaindex/doc": minor
"@llamaindex/examples": minor
"@llamaindex/e2e": minor
---
Remove re-exports from llamaindex main package
+5
View File
@@ -0,0 +1,5 @@
---
"@llamaindex/doc": patch
---
docs: update chat engine docs
+5
View File
@@ -0,0 +1,5 @@
---
"@llamaindex/doc": patch
---
docs: update workflow doc
+6
View File
@@ -0,0 +1,6 @@
---
"@llamaindex/core": patch
"llamaindex": patch
---
feat: asChatEngine function for index
+7
View File
@@ -0,0 +1,7 @@
---
"llamaindex": minor
"@llamaindex/cloudflare-hono": patch
"@llamaindex/examples": patch
---
Remove deprecated ServiceContext
+8
View File
@@ -0,0 +1,8 @@
---
"llamaindex": minor
"@llamaindex/doc": minor
"@llamaindex/examples": minor
"@llamaindex/unit-test": minor
---
Remove readers package from llamaindex
+1 -1
View File
@@ -25,4 +25,4 @@ jobs:
run: pnpm run build
- name: Pre Release
run: pnpx pkg-pr-new publish ./packages/* ./packages/providers/*
run: pnpx pkg-pr-new publish --pnpm ./packages/* ./packages/providers/* ./packages/providers/storage/*
-5
View File
@@ -83,11 +83,6 @@ jobs:
run: pnpm install
- name: Build
run: pnpm run build
- name: Use Build For Examples
run: |
pnpm link ../packages/llamaindex/
cd readers && pnpm link ../../packages/llamaindex/
working-directory: ./examples
- name: Run Type Check
run: pnpm run type-check
- name: Run Circular Dependency Check
+1 -3
View File
@@ -1,3 +1 @@
pnpm format
pnpm lint
npx lint-staged
pnpm run lint-staged
+1
View File
@@ -0,0 +1 @@
LlamaIndexTS
+2 -1
View File
@@ -14,5 +14,6 @@
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"prettier.prettierPath": "./node_modules/prettier"
"prettier.prettierPath": "./node_modules/prettier",
"prettier.configPath": "prettier.config.mjs"
}
+7 -33
View File
@@ -65,44 +65,18 @@ yarn add llamaindex
See our official document: <https://ts.llamaindex.ai/docs/llamaindex/getting_started/>
### Tips when using in non-Node.js environments
### Adding provider packages
When you are importing `llamaindex` in a non-Node.js environment(such as Vercel Edge, Cloudflare Workers, etc.)
Some classes are not exported from top-level entry file.
In most cases, you'll also need to install provider packages to use LlamaIndexTS. These are for adding AI models, file readers for ingestion or storing documents, e.g. in vector databases.
The reason is that some classes are only compatible with Node.js runtime,(e.g. `PDFReader`) which uses Node.js specific APIs(like `fs`, `child_process`, `crypto`).
For example, to use the OpenAI LLM, you would install the following package:
If you need any of those classes, you have to import them instead directly though their file path in the package.
Here's an example for importing the `PineconeVectorStore` class:
```typescript
import { PineconeVectorStore } from "llamaindex/vector-store/PineconeVectorStore";
```shell
npm install @llamaindex/openai
pnpm install @llamaindex/openai
yarn add @llamaindex/openai
```
As the `PDFReader` is not working with the Edge runtime, here's how to use the `SimpleDirectoryReader` with the `LlamaParseReader` to load PDFs:
```typescript
import { SimpleDirectoryReader } from "llamaindex/readers/SimpleDirectoryReader";
import { LlamaParseReader } from "llamaindex/readers/LlamaParseReader";
export const DATA_DIR = "./data";
export async function getDocuments() {
const reader = new SimpleDirectoryReader();
// Load PDFs using LlamaParseReader
return await reader.loadData({
directoryPath: DATA_DIR,
fileExtToReader: {
pdf: new LlamaParseReader({ resultType: "markdown" }),
},
});
}
```
> _Note_: Reader classes have to be added explictly to the `fileExtToReader` map in the Edge version of the `SimpleDirectoryReader`.
You'll find a complete example with LlamaIndexTS here: https://github.com/run-llama/create_llama_projects/tree/main/nextjs-edge-llamaparse
## Playground
Check out our NextJS playground at https://llama-playground.vercel.app/. The source is available at https://github.com/run-llama/ts-playground
@@ -57,4 +57,3 @@ In this example, the Context-Aware Agent uses the retriever to fetch relevant co
## Available Context-Aware Agents
- `OpenAIContextAwareAgent`: A context-aware agent using OpenAI's models.
- `AnthropicContextAwareAgent`: A context-aware agent using Anthropic's models.
@@ -15,7 +15,7 @@ In LlamaIndex, an agent is a semi-autonomous piece of software powered by an LLM
You'll need to have a recent version of [Node.js](https://nodejs.org/en) installed. Then you can install LlamaIndex.TS by running
```bash
npm install llamaindex
npm install llamaindex @llamaindex/openai @llamaindex/readers @llamaindex/huggingface
```
## Choose your model
@@ -40,7 +40,7 @@ We'll be bringing in `SimpleDirectoryReader`, `HuggingFaceEmbedding`, `VectorSto
import { FunctionTool, QueryEngineTool, Settings, VectorStoreIndex } from "llamaindex";
import { OpenAI, OpenAIAgent } from "@llamaindex/openai";
import { HuggingFaceEmbedding } from "@llamaindex/huggingface";
import { SimpleDirectoryReader } from "llamaindex";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
```
### Add an embedding model
@@ -10,7 +10,7 @@ import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
<Accordions>
<Accordion title="Install @llamaindex/readers">
If you want to only use reader modules, you can install `@llamaindex/readers`
If you want to use the reader module, you need to install `@llamaindex/readers`
<Tabs groupId="install-llamaindex" items={["npm", "yarn", "pnpm"]} persist>
```shell tab="npm"
@@ -31,72 +31,73 @@ import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
We offer readers for different file formats.
<Tabs groupId="llamaindex-or-readers" items={["llamaindex", "@llamaindex/readers"]} persist>
```ts twoslash tab="llamaindex"
import { CSVReader } from '@llamaindex/readers/csv'
import { PDFReader } from '@llamaindex/readers/pdf'
import { JSONReader } from '@llamaindex/readers/json'
import { MarkdownReader } from '@llamaindex/readers/markdown'
import { HTMLReader } from '@llamaindex/readers/html'
// you can find more readers in the documentation
```
```ts twoslash tab="@llamaindex/readers"
import { CSVReader } from '@llamaindex/readers/csv'
import { PDFReader } from '@llamaindex/readers/pdf'
import { JSONReader } from '@llamaindex/readers/json'
import { MarkdownReader } from '@llamaindex/readers/markdown'
import { HTMLReader } from '@llamaindex/readers/html'
// you can find more readers in the documentation
```
</Tabs>
```ts twoslash
import { CSVReader } from '@llamaindex/readers/csv'
import { PDFReader } from '@llamaindex/readers/pdf'
import { JSONReader } from '@llamaindex/readers/json'
import { MarkdownReader } from '@llamaindex/readers/markdown'
import { HTMLReader } from '@llamaindex/readers/html'
// you can find more readers in the documentation
```
## SimpleDirectoryReader
`SimpleDirectoryReader` is the simplest way to load data from local files into LlamaIndex.
<Tabs groupId="llamaindex-or-readers" items={["llamaindex", "@llamaindex/readers"]} persist>
```ts twoslash
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
```ts twoslash tab="llamaindex"
import { SimpleDirectoryReader } from "llamaindex";
const reader = new SimpleDirectoryReader()
const documents = await reader.loadData("./data")
// ^?
const reader = new SimpleDirectoryReader()
const documents = await reader.loadData("./data")
// ^?
const texts = documents.map(doc => doc.getText())
// ^?
```
```ts twoslash tab="@llamaindex/readers"
import { SimpleDirectoryReader } from "llamaindex";
const reader = new SimpleDirectoryReader()
const documents = await reader.loadData("./data")
// ^?
const texts = documents.map(doc => doc.getText())
// ^?
```
const texts = documents.map(doc => doc.getText())
// ^?
```
## Tips when using in non-Node.js environments
When using `@llamaindex/readers` in a non-Node.js environment (such as Vercel Edge, Cloudflare Workers, etc.)
Some classes are not exported from top-level entry file.
The reason is that some classes are only compatible with Node.js runtime, (e.g. `PDFReader`) which uses Node.js specific APIs (like `fs`, `child_process`, `crypto`).
If you need any of those classes, you have to import them instead directly through their file path in the package.
As the `PDFReader` is not working with the Edge runtime, here's how to use the `SimpleDirectoryReader` with the `LlamaParseReader` to load PDFs:
```typescript
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import { LlamaParseReader } from "@llamaindex/cloud";
export const DATA_DIR = "./data";
export async function getDocuments() {
const reader = new SimpleDirectoryReader();
// Load PDFs using LlamaParseReader
return await reader.loadData({
directoryPath: DATA_DIR,
fileExtToReader: {
pdf: new LlamaParseReader({ resultType: "markdown" }),
},
});
}
```
> _Note_: Reader classes have to be added explicitly to the `fileExtToReader` map in the Edge version of the `SimpleDirectoryReader`.
You'll find a complete example with LlamaIndexTS here: https://github.com/run-llama/create_llama_projects/tree/main/nextjs-edge-llamaparse
</Tabs>
## Load file natively using Node.js Customization Hooks
We have a helper utility to allow you to import a file in Node.js script.
<Tabs groupId="llamaindex-or-readers" items={["llamaindex", "@llamaindex/readers"]} persist>
```shell tab="llamaindex"
node --import llamaindex/register ./script.js
```
```shell tab="@llamaindex/readers"
node --import @llamaindex/readers/node ./script.js
```
</Tabs>
```shell
node --import @llamaindex/readers/node ./script.js
```
```ts
import csv from './path/to/data.csv';
@@ -12,9 +12,26 @@ const chatEngine = new ContextChatEngine({ retriever });
const response = await chatEngine.chat({ message: query });
```
In short, you can use the chat engine by calling `index.asChatEngine()`. It will return a `ContextChatEngine` to start chatting.
```typescript
const chatEngine = index.asChatEngine();
```
You can also pass in options to the chat engine.
```typescript
const chatEngine = index.asChatEngine({
similarityTopK: 5,
systemPrompt: "You are a helpful assistant.",
});
```
The `chat` function also supports streaming, just add `stream: true` as an option:
```typescript
const chatEngine = index.asChatEngine();
const stream = await chatEngine.chat({ message: query, stream: true });
for await (const chunk of stream) {
process.stdout.write(chunk.response);
@@ -34,7 +34,7 @@ import {
Settings,
} from "llamaindex";
import { OpenAI } from "@llamaindex/openai";
import { SimpleDirectoryReader } from "llamaindex";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
```
## Loading Data
@@ -124,7 +124,7 @@ import {
Settings,
} from "llamaindex";
import { OpenAI } from "@llamaindex/openai";
import { SimpleDirectoryReader } from "llamaindex";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
Settings.llm = new OpenAI();
Settings.nodeParser = new SentenceSplitter({
@@ -13,6 +13,22 @@ When a step function is added to a workflow, you need to specify the input and o
You can create a `Workflow` to do anything! Build an agent, a RAG flow, an extraction flow, or anything else you want.
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
<Tabs groupId="install" items={["npm", "yarn", "pnpm"]} persist>
```shell tab="npm"
npm install @llamaindex/workflow
```
```shell tab="yarn"
yarn add @llamaindex/workflow
```
```shell tab="pnpm"
pnpm add @llamaindex/workflow
```
</Tabs>
## Getting Started
As an illustrative example, let's consider a naive workflow where a joke is generated and then critiqued.
@@ -34,51 +50,59 @@ Events are user-defined classes that extend `WorkflowEvent` and contain arbitrar
```typescript
const llm = new OpenAI();
...
const jokeFlow = new Workflow({ verbose: true });
const jokeFlow = new Workflow<unknown, string, string>();
```
Our workflow is implemented by initiating the `Workflow` class. For simplicity, we created a `OpenAI` llm instance.
Our workflow is implemented by initiating the `Workflow` class with three generic types: the context type (unknown), input type (string), and output type (string). The context type is `unknown`, as we're not using a shared context in this example.
For simplicity, we created an `OpenAI` llm instance that we're using for inference in our workflow.
### Workflow Entry Points
```typescript
const generateJoke = async (_context: Context, ev: StartEvent) => {
const prompt = `Write your best joke about ${ev.data.input}.`;
const generateJoke = async (_: unknown, ev: StartEvent<string>) => {
const prompt = `Write your best joke about ${ev.data}.`;
const response = await llm.complete({ prompt });
return new JokeEvent({ joke: response.text });
};
```
Here, we come to the entry-point of our workflow. While events are user-defined, there are two special-case events, the `StartEvent` and the `StopEvent`. Here, the `StartEvent` signifies where to send the initial workflow input.
Here, we come to the entry-point of our workflow. While events are user-defined, there are two special-case events, the `StartEvent` and the `StopEvent`. These events are predefined, but we can specify the payload type using generic types. We're using `StartEvent<string>` to indicate that we're going to send an input of type string.
The `StartEvent` is a bit of a special object since it can hold arbitrary attributes. Here, we accessed the topic with `ev.data.input`.
At this point, you may have noticed that we haven't explicitly told the workflow what events are handled by which steps.
To do so, we use the `addStep` method which adds a step to the workflow. The first argument is the event type that the step will handle, and the second argument is the previously defined step function:
To add this step to the workflow, we use the `addStep` method with an object specifying the input and output event types:
```typescript
jokeFlow.addStep(StartEvent, generateJoke);
jokeFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [JokeEvent],
},
generateJoke
);
```
### Workflow Exit Points
```typescript
const critiqueJoke = async (_context: Context, ev: JokeEvent) => {
const critiqueJoke = async (_: unknown, ev: JokeEvent) => {
const prompt = `Give a thorough critique of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text });
return new StopEvent(response.text);
};
```
Here, we have our second, and last step, in the workflow. We know its the last step because the special `StopEvent` is returned. When the workflow encounters a returned `StopEvent`, it immediately stops the workflow and returns whatever the result was.
Here, we have our second and last step in the workflow. We know it's the last step because the special `StopEvent` is returned. When the workflow encounters a returned `StopEvent`, it immediately stops the workflow and returns the result. Note that we're using the generic type `StopEvent<string>` to indicate that we're returning a string.
In this case, the result is a string, but it could be a map, array, or any other object.
Don't forget to add the step to the workflow:
Add this step to the workflow:
```typescript
jokeFlow.addStep(JokeEvent, critiqueJoke);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [StopEvent<string>],
},
critiqueJoke
);
```
### Running the Workflow
@@ -90,42 +114,25 @@ console.log(result.data.result);
Lastly, we run the workflow. The `.run()` method is async, so we use await here to wait for the result.
### Validating Workflows
## Working with Shared Context/State
To tell the workflow what events are produced by each step, you can optionally provide a third argument to `addStep` to specify the output event type:
Optionally, you can choose to use a shared context between steps by specifying a context type when creating the workflow. Here's an example where multiple steps access a shared state:
```typescript
jokeFlow.addStep(StartEvent, generateJoke, { outputs: JokeEvent });
jokeFlow.addStep(JokeEvent, critiqueJoke, { outputs: StopEvent });
```
import { HandlerContext } from "@llamaindex/workflow";
To validate a workflow, you need to call the `validate` method:
type MyContextData = {
query: string;
intermediateResults: any[];
}
```typescript
jokeFlow.validate();
```
To automatically validate a workflow when you run it, you can set the `validate` flag to `true` at initialization:
```typescript
const jokeFlow = new Workflow({ verbose: true, validate: true });
```
## Working with Global Context/State
Optionally, you can choose to use global context between steps. For example, maybe multiple steps access the original `query` input from the user. You can store this in global context so that every step has access.
```typescript
import { Context } from "llamaindex";
const query = async (context: Context, ev: MyEvent) => {
const query = async (context: HandlerContext<MyContextData>, ev: MyEvent) => {
// get the query from the context
const query = context.get("query");
const query = context.data.query;
// do something with context and event
const val = ...
const result = ...
// store in context
context.set("key", val);
context.data.intermediateResults.push(val);
return new StopEvent({ result });
};
@@ -138,28 +145,15 @@ The context does more than just hold data, it also provides utilities to buffer
For example, you might have a step that waits for a query and retrieved nodes before synthesizing a response:
```typescript
const synthesize = async (context: Context, ev: QueryEvent | RetrieveEvent) => {
const events = context.collectEvents(ev, [QueryEvent | RetrieveEvent]);
if (!events) {
return;
}
const prompt = events
.map((event) => {
if (event instanceof QueryEvent) {
return `Answer this query using the context provided: ${event.data.query}`;
} else if (event instanceof RetrieveEvent) {
return `Context: ${event.data.context}`;
}
return "";
})
.join("\n");
const synthesize = async (context: Context, ev1: QueryEvent, ev2: RetrieveEvent) => {
const subPrompts = [`Answer this query using the context provided: ${ev1.data.query}`, `Context: ${ev2.data.context}`];
const prompt = subPrompts.join("\n");
const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text });
};
```
Using `ctx.collectEvents()` we can buffer and wait for ALL expected events to arrive. This function will only return events (in the requested order) once all events have arrived.
Passing multiple events, we can buffer and wait for ALL expected events to arrive. The receiving step function will only be called once all events have arrived.
## Manually Triggering Events
+1
View File
@@ -1 +1,2 @@
logs
.temp
+9 -12
View File
@@ -17,23 +17,21 @@ app.post("/llm", async (c) => {
const { message } = await c.req.json();
const { extractText } = await import("@llamaindex/core/utils");
const {
extractText,
QueryEngineTool,
serviceContextFromDefaults,
VectorStoreIndex,
OpenAIAgent,
Settings,
OpenAI,
OpenAIEmbedding,
SentenceSplitter,
} = await import("llamaindex");
const { PineconeVectorStore } = await import(
"llamaindex/vector-store/PineconeVectorStore"
const { OpenAIAgent, OpenAI, OpenAIEmbedding } = await import(
"@llamaindex/openai"
);
const llm = new OpenAI({
const { PineconeVectorStore } = await import("@llamaindex/pinecone");
Settings.llm = new OpenAI({
model: "gpt-4o-mini",
apiKey: c.env.OPENAI_API_KEY,
});
@@ -43,8 +41,7 @@ app.post("/llm", async (c) => {
apiKey: c.env.OPENAI_API_KEY,
});
const serviceContext = serviceContextFromDefaults({
llm,
Settings.nodeParser = new SentenceSplitter({
chunkSize: 8191,
chunkOverlap: 0,
});
@@ -53,7 +50,7 @@ app.post("/llm", async (c) => {
namespace: "8xolsn4ulEQGdhnhP76yCzfLHdOZ",
});
const index = await VectorStoreIndex.fromVectorStore(store, serviceContext);
const index = await VectorStoreIndex.fromVectorStore(store);
const retriever = index.asRetriever({
similarityTopK: 3,
@@ -9,6 +9,8 @@
},
"dependencies": {
"llamaindex": "workspace:*",
"@llamaindex/huggingface": "workspace:*",
"@llamaindex/readers": "workspace:*",
"next": "15.0.3",
"react": "18.3.1",
"react-dom": "18.3.1"
@@ -1,13 +1,13 @@
"use server";
import { HuggingFaceEmbedding } from "@llamaindex/huggingface";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import {
OpenAI,
OpenAIAgent,
QueryEngineTool,
Settings,
SimpleDirectoryReader,
VectorStoreIndex,
} from "llamaindex";
import { HuggingFaceEmbedding } from "llamaindex/embeddings/HuggingFaceEmbedding";
Settings.llm = new OpenAI({
apiKey: process.env.NEXT_PUBLIC_OPENAI_KEY ?? "FAKE_KEY_TO_PASS_TESTS",
@@ -9,6 +9,7 @@
"start": "waku start"
},
"dependencies": {
"@llamaindex/env": "workspace:*",
"llamaindex": "workspace:*",
"react": "19.0.0-rc-5c56b873-20241107",
"react-dom": "19.0.0-rc-5c56b873-20241107",
@@ -1,13 +1,14 @@
"use server";
import { fs } from "@llamaindex/env";
import { BaseQueryEngine, Document, VectorStoreIndex } from "llamaindex";
import { readFile } from "node:fs/promises";
let _queryEngine: BaseQueryEngine;
async function lazyLoadQueryEngine() {
if (!_queryEngine) {
const path = "node_modules/llamaindex/examples/abramov.txt";
const essay = await readFile(path, "utf-8");
const essay = await fs.readFile(path, "utf-8");
// Create Document object with essay
const document = new Document({ text: essay, id_: path });
+2 -2
View File
@@ -1,7 +1,7 @@
import { Anthropic, AnthropicAgent } from "@llamaindex/anthropic";
import { extractText } from "@llamaindex/core/utils";
import { consola } from "consola";
import { Anthropic, FunctionTool, Settings, type LLM } from "llamaindex";
import { AnthropicAgent } from "llamaindex/agent/anthropic";
import { FunctionTool, Settings, type LLM } from "llamaindex";
import { ok } from "node:assert";
import { beforeEach, test } from "node:test";
import { getWeatherTool, sumNumbersTool } from "./fixtures/tools.js";
+2 -1
View File
@@ -1,6 +1,7 @@
import { ClipEmbedding } from "@llamaindex/clip";
import type { LoadTransformerEvent } from "@llamaindex/env/multi-model";
import { setTransformers } from "@llamaindex/env/multi-model";
import { ClipEmbedding, ImageNode, Settings } from "llamaindex";
import { ImageNode, Settings } from "llamaindex";
import assert from "node:assert";
import { type Mock, test } from "node:test";
+86
View File
@@ -0,0 +1,86 @@
import { execSync } from "node:child_process";
import { mkdir, rm, writeFile } from "node:fs/promises";
import { resolve } from "node:path";
import { test } from "node:test";
import { testRootDir } from "./utils.js";
await test("cjs/esm dual module check", async (t) => {
const esmImports = `import fs from 'node:fs/promises'
import { Document, MetadataMode, VectorStoreIndex } from 'llamaindex'
import { OpenAIEmbedding } from '@llamaindex/openai'
import { Settings } from '@llamaindex/core/global'`;
const cjsRequire = `const fs = require('fs').promises
const { Document, MetadataMode, VectorStoreIndex } = require('llamaindex')
const { OpenAIEmbedding } = require('@llamaindex/openai')
const { Settings } = require('@llamaindex/core/global')`;
const mainCode = `
async function main() {
Settings.embedModel = new OpenAIEmbedding({
model: 'text-embedding-3-small',
apiKey: '${process.env.OPENAI_API_KEY}',
})
const model = Settings.embedModel
if (model == null) {
process.exit(-1)
}
}
main().catch(console.error)`;
t.before(async () => {
await mkdir(resolve(testRootDir, ".temp"), {
recursive: true,
mode: 0o755,
});
});
t.after(async () => {
await rm(resolve(testRootDir, ".temp"), {
recursive: true,
force: true,
});
});
await t.test("cjs", async () => {
const cjsCode = `${cjsRequire}\n${mainCode}`;
const filePath = resolve(
testRootDir,
".temp",
`${crypto.randomUUID()}.cjs`,
);
await writeFile(filePath, cjsCode, "utf-8");
execSync(`${process.argv[0]} ${filePath}`, {
cwd: process.cwd(),
});
});
await t.test("esm", async () => {
const esmCode = `${esmImports}\n${mainCode}`;
const filePath = resolve(
testRootDir,
".temp",
`${crypto.randomUUID()}.mjs`,
);
await writeFile(filePath, esmCode, "utf-8");
execSync(`${process.argv[0]} ${filePath}`, {
cwd: process.cwd(),
});
});
const specialConditions = ["edge-light", "workerd", "react-server"];
for (const condition of specialConditions) {
await t.test(condition, async () => {
const esmCode = `${esmImports}\n${mainCode}`;
const filePath = resolve(
testRootDir,
".temp",
`${crypto.randomUUID()}.mjs`,
);
await writeFile(filePath, esmCode, "utf-8");
execSync(`${process.argv[0]} ${filePath} -C ${condition}`, {
cwd: process.cwd(),
});
});
}
});
+1 -1
View File
@@ -1,6 +1,6 @@
import { PGVectorStore } from "@llamaindex/postgres";
import { config } from "dotenv";
import { Document, VectorStoreQueryMode } from "llamaindex";
import { PGVectorStore } from "llamaindex/vector-store/PGVectorStore";
import assert from "node:assert";
import { test } from "node:test";
import pg from "pg";
+3 -5
View File
@@ -1,10 +1,8 @@
import { Document, MetadataMode } from "@llamaindex/core/schema";
import { OpenAIEmbedding } from "@llamaindex/openai";
import { PineconeVectorStore } from "@llamaindex/pinecone";
import { config } from "dotenv";
import {
OpenAIEmbedding,
PineconeVectorStore,
VectorStoreIndex,
} from "llamaindex";
import { VectorStoreIndex } from "llamaindex";
import assert from "node:assert";
import { test } from "node:test";
+4
View File
@@ -14,6 +14,10 @@
"@llamaindex/env": "workspace:*",
"@llamaindex/ollama": "workspace:*",
"@llamaindex/openai": "workspace:*",
"@llamaindex/pinecone": "workspace:*",
"@llamaindex/postgres": "workspace:*",
"@llamaindex/clip": "workspace:*",
"@llamaindex/anthropic": "workspace:*",
"@types/node": "^22.9.0",
"@types/pg": "^8.11.8",
"@huggingface/transformers": "^3.0.2",
+2 -5
View File
@@ -1,9 +1,6 @@
import { OpenAIAgent } from "@llamaindex/openai";
import {
QueryEngineTool,
SimpleDirectoryReader,
VectorStoreIndex,
} from "llamaindex";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import { QueryEngineTool, VectorStoreIndex } from "llamaindex";
async function main() {
// Load the documents
+1 -1
View File
@@ -1,9 +1,9 @@
import { OpenAIAgent } from "@llamaindex/openai";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import {
FunctionTool,
MetadataMode,
NodeWithScore,
SimpleDirectoryReader,
VectorStoreIndex,
} from "llamaindex";
+2 -5
View File
@@ -1,9 +1,6 @@
import { OpenAIAgent } from "@llamaindex/openai";
import {
QueryEngineTool,
SimpleDirectoryReader,
VectorStoreIndex,
} from "llamaindex";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import { QueryEngineTool, VectorStoreIndex } from "llamaindex";
async function main() {
// Load the documents
+2 -3
View File
@@ -1,5 +1,5 @@
import { AstraDBVectorStore } from "@llamaindex/astra";
import { VectorStoreIndex, serviceContextFromDefaults } from "llamaindex";
import { VectorStoreIndex } from "llamaindex";
const collectionName = "movie_reviews";
@@ -8,8 +8,7 @@ async function main() {
const astraVS = new AstraDBVectorStore({ contentKey: "reviewtext" });
await astraVS.connect(collectionName);
const ctx = serviceContextFromDefaults();
const index = await VectorStoreIndex.fromVectorStore(astraVS, ctx);
const index = await VectorStoreIndex.fromVectorStore(astraVS);
const retriever = await index.asRetriever({ similarityTopK: 20 });
+15
View File
@@ -0,0 +1,15 @@
import { Document, KeywordTableIndex } from "llamaindex";
import essay from "../essay";
async function main() {
const document = new Document({ text: essay });
const index = await KeywordTableIndex.fromDocuments([document]);
const chatEngine = index.asChatEngine();
const response = await chatEngine.chat({
message: "What is Harsh Mistress?",
});
console.log(response.message.content);
}
main().catch(console.error);
+17
View File
@@ -0,0 +1,17 @@
import { Document, SummaryIndex, SummaryRetrieverMode } from "llamaindex";
import essay from "../essay";
async function main() {
const document = new Document({ text: essay });
const index = await SummaryIndex.fromDocuments([document]);
const chatEngine = index.asChatEngine({
mode: SummaryRetrieverMode.LLM,
});
const response = await chatEngine.chat({
message: "Summary about the author",
});
console.log(response.message.content);
}
main().catch(console.error);
@@ -0,0 +1,15 @@
import { Document, VectorStoreIndex } from "llamaindex";
import essay from "../essay";
async function main() {
const document = new Document({ text: essay });
const index = await VectorStoreIndex.fromDocuments([document]);
const chatEngine = index.asChatEngine({ similarityTopK: 5 });
const response = await chatEngine.chat({
message: "What did I work on in February 2021?",
});
console.log(response.message.content);
}
main().catch(console.error);
+1 -1
View File
@@ -1,4 +1,4 @@
import { SimpleDirectoryReader } from "llamaindex";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
function callback(
category: string,
+1 -2
View File
@@ -30,13 +30,12 @@ async function main() {
// Split text and create embeddings. Store them in a VectorStoreIndex
// var storageContext = await storageContextFromDefaults({});
// var serviceContext = serviceContextFromDefaults({});
// const docStore = storageContext.docStore;
// for (const doc of documents) {
// docStore.setDocumentHash(doc.id_, doc.hash);
// }
// const nodes = serviceContext.nodeParser.getNodesFromDocuments(documents);
// const nodes = Settings.nodeParser.getNodesFromDocuments(documents);
// console.log(nodes);
//
+1 -1
View File
@@ -1,9 +1,9 @@
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import {
ImageDocument,
JinaAIEmbedding,
similarity,
SimilarityType,
SimpleDirectoryReader,
} from "llamaindex";
import path from "path";
+2 -1
View File
@@ -1,4 +1,5 @@
import { Settings, SimpleDirectoryReader, VectorStoreIndex } from "llamaindex";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import { Settings, VectorStoreIndex } from "llamaindex";
import path from "path";
import { getStorageContext } from "./storage";
+9 -10
View File
@@ -1,17 +1,16 @@
import { storageContextFromDefaults } from "llamaindex";
import { ClipEmbedding } from "@llamaindex/clip";
import { path } from "@llamaindex/env";
import { SimpleVectorStore, storageContextFromDefaults } from "llamaindex";
// set up store context with two vector stores, one for text, the other for images
export async function getStorageContext() {
return await storageContextFromDefaults({
persistDir: "storage",
storeImages: true,
// if storeImages is true, the following vector store will be added
// vectorStores: {
// IMAGE: SimpleVectorStore.fromPersistDir(
// `${persistDir}/images`,
// fs,
// new ClipEmbedding(),
// ),
// },
vectorStores: {
IMAGE: await SimpleVectorStore.fromPersistDir(
path.join("storage", "images"),
new ClipEmbedding(),
),
},
});
}
+1 -2
View File
@@ -1,5 +1,4 @@
import { OllamaEmbedding } from "@llamaindex/ollama";
import { Ollama } from "llamaindex/llm/ollama";
import { Ollama, OllamaEmbedding } from "@llamaindex/ollama";
(async () => {
const llm = new Ollama({
+38 -37
View File
@@ -1,63 +1,64 @@
{
"name": "@llamaindex/examples",
"private": true,
"version": "0.1.3",
"private": true,
"scripts": {
"lint": "eslint .",
"start": "tsx ./starter.ts"
},
"dependencies": {
"@ai-sdk/openai": "^1.0.5",
"@azure/cosmos": "^4.1.1",
"@azure/identity": "^4.4.1",
"@azure/search-documents": "^12.1.0",
"@llamaindex/vercel": "^0.0.10",
"@llamaindex/workflow": "^0.0.10",
"@llamaindex/anthropic": "workspace:* || ^0.0.33",
"@llamaindex/astra": "workspace:* || ^0.0.4",
"@llamaindex/azure": "workspace:* || ^0.0.4",
"@llamaindex/chroma": "workspace:* || ^0.0.4",
"@llamaindex/clip": "workspace:* || ^0.0.35",
"@llamaindex/cloud": "workspace:* || ^2.0.24",
"@llamaindex/cohere": "workspace:* || ^0.0.4",
"@llamaindex/deepinfra": "workspace:* || ^0.0.35",
"@llamaindex/env": "workspace:* || ^0.1.27",
"@llamaindex/google": "workspace:* || ^0.0.6",
"@llamaindex/groq": "workspace:* || ^0.0.50",
"@llamaindex/huggingface": "workspace:* || ^0.0.35",
"@llamaindex/milvus": "workspace:* || ^0.0.4",
"@llamaindex/mistral": "workspace:* || ^0.0.4",
"@llamaindex/mixedbread": "workspace:* || ^0.0.4",
"@llamaindex/mongodb": "workspace:* || ^0.0.4",
"@llamaindex/node-parser": "workspace:* || ^0.0.24",
"@llamaindex/ollama": "workspace:* || ^0.0.39",
"@llamaindex/openai": "workspace:* || ^0.1.51",
"@llamaindex/pinecone": "workspace:* || ^0.0.4",
"@llamaindex/portkey-ai": "workspace:* || ^0.0.32",
"@llamaindex/postgres": "workspace:* || ^0.0.32",
"@llamaindex/qdrant": "workspace:* || ^0.0.4",
"@llamaindex/readers": "workspace:* || ^1.0.25",
"@llamaindex/replicate": "workspace:* || ^0.0.32",
"@llamaindex/upstash": "workspace:* || ^0.0.4",
"@llamaindex/vercel": "workspace:* || ^0.0.10",
"@llamaindex/vllm": "workspace:* || ^0.0.21",
"@llamaindex/weaviate": "workspace:* || ^0.0.4",
"@llamaindex/workflow": "workspace:* || ^0.0.10",
"@notionhq/client": "^2.2.15",
"@pinecone-database/pinecone": "^4.0.0",
"@vercel/postgres": "^0.10.0",
"ai": "^4.0.0",
"ajv": "^8.17.1",
"commander": "^12.1.0",
"dotenv": "^16.4.5",
"js-tiktoken": "^1.0.14",
"llamaindex": "^0.8.37",
"llamaindex": "workspace:* || ^0.8.37",
"mongodb": "6.7.0",
"postgres": "^3.4.4",
"ajv": "^8.17.1",
"wikipedia": "^2.1.2",
"@llamaindex/openai": "workspace:*",
"@llamaindex/cloud": "workspace:*",
"@llamaindex/anthropic": "workspace:*",
"@llamaindex/clip": "workspace:*",
"@llamaindex/azure": "workspace:*",
"@llamaindex/deepinfra": "workspace:*",
"@llamaindex/groq": "workspace:*",
"@llamaindex/huggingface": "workspace:*",
"@llamaindex/node-parser": "workspace:*",
"@llamaindex/ollama": "workspace:*",
"@llamaindex/portkey-ai": "workspace:*",
"@llamaindex/readers": "workspace:*",
"@llamaindex/replicate": "workspace:*",
"@llamaindex/vllm": "workspace:*",
"@llamaindex/postgres": "workspace:*",
"@llamaindex/astra": "workspace:*",
"@llamaindex/milvus": "workspace:*",
"@llamaindex/chroma": "workspace:*",
"@llamaindex/mongodb": "workspace:*",
"@llamaindex/pinecone": "workspace:*",
"@llamaindex/qdrant": "workspace:*",
"@llamaindex/upstash": "workspace:*",
"@llamaindex/weaviate": "workspace:*",
"@llamaindex/google": "workspace:*",
"@llamaindex/mistral": "workspace:*",
"@llamaindex/mixedbread": "workspace:*",
"@llamaindex/cohere": "workspace:*"
"wikipedia": "^2.1.2"
},
"devDependencies": {
"@types/node": "^22.9.0",
"tsx": "^4.19.0",
"typescript": "^5.7.2"
},
"scripts": {
"lint": "eslint .",
"start": "tsx ./starter.ts"
},
"stackblitz": {
"startCommand": "npm start"
}
+2 -5
View File
@@ -1,11 +1,8 @@
// load-docs.ts
import { PineconeVectorStore } from "@llamaindex/pinecone";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import fs from "fs/promises";
import {
SimpleDirectoryReader,
storageContextFromDefaults,
VectorStoreIndex,
} from "llamaindex";
import { storageContextFromDefaults, VectorStoreIndex } from "llamaindex";
async function getSourceFilenames(sourceDir: string) {
return await fs
+3 -3
View File
@@ -19,9 +19,9 @@
"start:obsidian": "node --import tsx ./src/obsidian.ts"
},
"dependencies": {
"@llamaindex/readers": "*",
"llamaindex": "*",
"@llamaindex/cloud": "*"
"@llamaindex/cloud": "workspace:* || ^2.0.24",
"@llamaindex/readers": "workspace:* || ^1.0.25",
"llamaindex": "workspace:* || ^0.8.37"
},
"devDependencies": {
"@types/node": "^22.9.0",
@@ -1,10 +1,10 @@
import { TextFileReader } from "@llamaindex/readers/text";
import type { Document, Metadata } from "llamaindex";
import {
FILE_EXT_TO_READER,
FileReader,
SimpleDirectoryReader,
} from "llamaindex";
} from "@llamaindex/readers/directory";
import { TextFileReader } from "@llamaindex/readers/text";
import type { Document, Metadata } from "llamaindex";
import { FileReader } from "llamaindex";
class ZipReader extends FileReader {
loadDataAsContent(fileContent: Uint8Array): Promise<Document<Metadata>[]> {
@@ -1,5 +1,6 @@
import { LlamaParseReader } from "@llamaindex/cloud";
import { SimpleDirectoryReader, VectorStoreIndex } from "llamaindex";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import { VectorStoreIndex } from "llamaindex";
async function main() {
const reader = new SimpleDirectoryReader();
@@ -1,6 +1,4 @@
import { SimpleDirectoryReader } from "llamaindex";
// or
// import { SimpleDirectoryReader } from 'llamaindex'
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
const reader = new SimpleDirectoryReader();
const documents = await reader.loadData("../data");
+1 -1
View File
@@ -1,9 +1,9 @@
import { OpenAI } from "@llamaindex/openai";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import {
RouterQueryEngine,
SentenceSplitter,
Settings,
SimpleDirectoryReader,
SummaryIndex,
VectorStoreIndex,
} from "llamaindex";
+1 -1
View File
@@ -14,6 +14,7 @@ import {
MetadataIndexFieldType,
} from "@llamaindex/azure";
import { OpenAI, OpenAIEmbedding } from "@llamaindex/openai";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import dotenv from "dotenv";
import {
Document,
@@ -22,7 +23,6 @@ import {
Metadata,
NodeWithScore,
Settings,
SimpleDirectoryReader,
storageContextFromDefaults,
TextNode,
VectorStoreIndex,
+2 -5
View File
@@ -1,10 +1,7 @@
// load-docs.ts
import { PGVectorStore } from "@llamaindex/postgres";
import {
SimpleDirectoryReader,
storageContextFromDefaults,
VectorStoreIndex,
} from "llamaindex";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import { storageContextFromDefaults, VectorStoreIndex } from "llamaindex";
import fs from "node:fs/promises";
async function getSourceFilenames(sourceDir: string) {
+1 -1
View File
@@ -1,6 +1,6 @@
import { PGVectorStore } from "@llamaindex/postgres";
import dotenv from "dotenv";
import { Document, VectorStoreQueryMode } from "llamaindex";
import { PGVectorStore } from "llamaindex/vector-store/PGVectorStore";
import postgres from "postgres";
dotenv.config();
+1 -1
View File
@@ -1,5 +1,5 @@
import { PGVectorStore } from "@llamaindex/postgres";
import { VectorStoreIndex } from "llamaindex";
import { PGVectorStore } from "llamaindex/vector-store/PGVectorStore";
async function main() {
// eslint-disable-next-line @typescript-eslint/no-require-imports
+2 -5
View File
@@ -1,10 +1,7 @@
import { PGVectorStore } from "@llamaindex/postgres";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import dotenv from "dotenv";
import {
SimpleDirectoryReader,
storageContextFromDefaults,
VectorStoreIndex,
} from "llamaindex";
import { storageContextFromDefaults, VectorStoreIndex } from "llamaindex";
dotenv.config();
+1 -1
View File
@@ -1,8 +1,8 @@
// https://vercel.com/docs/storage/vercel-postgres/sdk
import { PGVectorStore } from "@llamaindex/postgres";
import { sql } from "@vercel/postgres";
import dotenv from "dotenv";
import { Document, VectorStoreQueryMode } from "llamaindex";
import { PGVectorStore } from "llamaindex/vector-store/PGVectorStore";
dotenv.config();
+10 -4
View File
@@ -2,8 +2,9 @@
"name": "@llamaindex/monorepo",
"private": true,
"scripts": {
"build": "turbo run build --filter=\"./packages/*\" --filter=\"./packages/providers/*\"",
"dev": "turbo run dev --filter=\"./packages/*\" --filter=\"./packages/providers/*\"",
"clean": "find . -type d \\( -name .turbo -o -name node_modules -o -name dist -o -name .next -o -name lib \\) -exec rm -rf {} +",
"build": "turbo run build --filter=\"./packages/*\" --filter=\"./packages/providers/**\"",
"dev": "turbo run dev --filter=\"./packages/*\" --filter=\"./packages/providers/**\"",
"format": "prettier --ignore-unknown --cache --check .",
"format:write": "prettier --ignore-unknown --write .",
"lint": "turbo run lint",
@@ -15,7 +16,8 @@
"release": "pnpm run build && changeset publish",
"release-snapshot": "pnpm run build && changeset publish --tag snapshot",
"new-version": "changeset version && pnpm format:write && pnpm run build",
"new-snapshot": "pnpm run build && changeset version --snapshot"
"new-snapshot": "pnpm run build && changeset version --snapshot",
"lint-staged": "lint-staged"
},
"devDependencies": {
"@changesets/cli": "^2.27.5",
@@ -36,6 +38,10 @@
},
"packageManager": "pnpm@9.12.3",
"lint-staged": {
"(!apps/docs/i18n/**/docusaurus-plugin-content-docs/current/api/*).{js,jsx,ts,tsx,md}": "prettier --write"
"*.{js,jsx,ts,tsx}": [
"prettier --check",
"eslint"
],
"*.{json,md}": "prettier --check"
}
}
@@ -82,11 +82,8 @@
}
.background-gradient {
background-color: #fff;
background-image: radial-gradient(
at 21% 11%,
rgba(186, 186, 233, 0.53) 0,
transparent 50%
),
background-image:
radial-gradient(at 21% 11%, rgba(186, 186, 233, 0.53) 0, transparent 50%),
radial-gradient(at 85% 0, hsla(46, 57%, 78%, 0.52) 0, transparent 50%),
radial-gradient(at 91% 36%, rgba(194, 213, 255, 0.68) 0, transparent 50%),
radial-gradient(at 8% 40%, rgba(251, 218, 239, 0.46) 0, transparent 50%);
+5
View File
@@ -1,6 +1,11 @@
{
"name": "@llamaindex/autotool",
"type": "module",
"repository": {
"type": "git",
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
"directory": "packages/autotool"
},
"version": "5.0.37",
"description": "auto transpile your JS function to LLM Agent compatible",
"files": [
+1 -1
View File
@@ -60,7 +60,7 @@
},
"repository": {
"type": "git",
"url": "https://github.com/run-llama/LlamaIndexTS.git",
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
"directory": "packages/cloud"
},
"devDependencies": {
+1 -1
View File
@@ -34,7 +34,7 @@
],
"repository": {
"type": "git",
"url": "https://github.com/run-llama/LlamaIndexTS.git",
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
"directory": "packages/community"
},
"scripts": {
+1 -1
View File
@@ -386,7 +386,7 @@
"repository": {
"type": "git",
"directory": "packages/core",
"url": "https://github.com/run-llama/LlamaIndexTS.git"
"url": "git+https://github.com/run-llama/LlamaIndexTS.git"
},
"devDependencies": {
"@edge-runtime/vm": "^4.0.4",
@@ -20,6 +20,16 @@ import type {
import { DefaultContextGenerator } from "./default-context-generator";
import type { ContextGenerator } from "./type";
export type ContextChatEngineOptions = {
retriever: BaseRetriever;
chatModel?: LLM | undefined;
chatHistory?: ChatMessage[] | undefined;
contextSystemPrompt?: ContextSystemPrompt | undefined;
nodePostprocessors?: BaseNodePostprocessor[] | undefined;
systemPrompt?: string | undefined;
contextRole?: MessageType | undefined;
};
/**
* ContextChatEngine uses the Index to get the appropriate context for each query.
* The context is stored in the system prompt, and the chat history is chunk,
@@ -35,15 +45,7 @@ export class ContextChatEngine extends PromptMixin implements BaseChatEngine {
return this.memory.getMessages();
}
constructor(init: {
retriever: BaseRetriever;
chatModel?: LLM | undefined;
chatHistory?: ChatMessage[] | undefined;
contextSystemPrompt?: ContextSystemPrompt | undefined;
nodePostprocessors?: BaseNodePostprocessor[] | undefined;
systemPrompt?: string | undefined;
contextRole?: MessageType | undefined;
}) {
constructor(init: ContextChatEngineOptions) {
super();
this.chatModel = init.chatModel ?? Settings.llm;
this.memory = new ChatMemoryBuffer({ chatHistory: init?.chatHistory });
+4 -1
View File
@@ -4,6 +4,9 @@ export {
type NonStreamingChatEngineParams,
type StreamingChatEngineParams,
} from "./base";
export { ContextChatEngine } from "./context-chat-engine";
export {
ContextChatEngine,
type ContextChatEngineOptions,
} from "./context-chat-engine";
export { DefaultContextGenerator } from "./default-context-generator";
export { SimpleChatEngine } from "./simple-chat-engine";
-1
View File
@@ -16,7 +16,6 @@ export const DEFAULT_DOC_STORE_PERSIST_FILENAME = "doc_store.json";
export const DEFAULT_VECTOR_STORE_PERSIST_FILENAME = "vector_store.json";
export const DEFAULT_GRAPH_STORE_PERSIST_FILENAME = "graph_store.json";
export const DEFAULT_NAMESPACE = "docstore";
export const DEFAULT_IMAGE_VECTOR_NAMESPACE = "images";
//#endregion
//#region llama cloud
export const DEFAULT_PROJECT_NAME = "Default";
+1 -1
View File
@@ -113,7 +113,7 @@
],
"repository": {
"type": "git",
"url": "https://github.com/run-llama/LlamaIndexTS.git",
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
"directory": "packages/env"
},
"scripts": {
+1 -1
View File
@@ -42,7 +42,7 @@
],
"repository": {
"type": "git",
"url": "https://github.com/run-llama/LlamaIndexTS.git",
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
"directory": "packages/experimental"
},
"scripts": {
+1 -25
View File
@@ -20,35 +20,11 @@
"llamaindex"
],
"dependencies": {
"@llamaindex/anthropic": "workspace:*",
"@llamaindex/clip": "workspace:*",
"@llamaindex/cloud": "workspace:*",
"@llamaindex/core": "workspace:*",
"@llamaindex/deepinfra": "workspace:*",
"@llamaindex/env": "workspace:*",
"@llamaindex/groq": "workspace:*",
"@llamaindex/huggingface": "workspace:*",
"@llamaindex/node-parser": "workspace:*",
"@llamaindex/ollama": "workspace:*",
"@llamaindex/openai": "workspace:*",
"@llamaindex/portkey-ai": "workspace:*",
"@llamaindex/readers": "workspace:*",
"@llamaindex/replicate": "workspace:*",
"@llamaindex/vllm": "workspace:*",
"@llamaindex/postgres": "workspace:*",
"@llamaindex/azure": "workspace:*",
"@llamaindex/astra": "workspace:*",
"@llamaindex/milvus": "workspace:*",
"@llamaindex/chroma": "workspace:*",
"@llamaindex/mongodb": "workspace:*",
"@llamaindex/pinecone": "workspace:*",
"@llamaindex/qdrant": "workspace:*",
"@llamaindex/upstash": "workspace:*",
"@llamaindex/weaviate": "workspace:*",
"@llamaindex/google": "workspace:*",
"@llamaindex/mistral": "workspace:*",
"@llamaindex/mixedbread": "workspace:*",
"@llamaindex/cohere": "workspace:*",
"@types/lodash": "^4.17.7",
"@types/node": "^22.9.0",
"ajv": "^8.17.1",
@@ -144,7 +120,7 @@
],
"repository": {
"type": "git",
"url": "https://github.com/run-llama/LlamaIndexTS.git",
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
"directory": "packages/llamaindex"
},
"scripts": {
-67
View File
@@ -1,67 +0,0 @@
import type { BaseEmbedding } from "@llamaindex/core/embeddings";
import { PromptHelper } from "@llamaindex/core/indices";
import type { LLM } from "@llamaindex/core/llms";
import {
type NodeParser,
SentenceSplitter,
} from "@llamaindex/core/node-parser";
import { OpenAI, OpenAIEmbedding } from "@llamaindex/openai";
/**
* The ServiceContext is a collection of components that are used in different parts of the application.
*
* @deprecated This will no longer supported, please use `Settings` instead.
*/
export interface ServiceContext {
llm: LLM;
promptHelper: PromptHelper;
embedModel: BaseEmbedding;
nodeParser: NodeParser;
// llamaLogger: any;
}
export interface ServiceContextOptions {
llm?: LLM;
promptHelper?: PromptHelper;
embedModel?: BaseEmbedding;
nodeParser?: NodeParser;
// NodeParser arguments
chunkSize?: number;
chunkOverlap?: number;
}
export function serviceContextFromDefaults(options?: ServiceContextOptions) {
const serviceContext: ServiceContext = {
llm: options?.llm ?? new OpenAI(),
embedModel: options?.embedModel ?? new OpenAIEmbedding(),
nodeParser:
options?.nodeParser ??
new SentenceSplitter({
chunkSize: options?.chunkSize,
chunkOverlap: options?.chunkOverlap,
}),
promptHelper: options?.promptHelper ?? new PromptHelper(),
};
return serviceContext;
}
export function serviceContextFromServiceContext(
serviceContext: ServiceContext,
options: ServiceContextOptions,
) {
const newServiceContext = { ...serviceContext };
if (options.llm) {
newServiceContext.llm = options.llm;
}
if (options.promptHelper) {
newServiceContext.promptHelper = options.promptHelper;
}
if (options.embedModel) {
newServiceContext.embedModel = options.embedModel;
}
if (options.nodeParser) {
newServiceContext.nodeParser = options.nodeParser;
}
return newServiceContext;
}
-39
View File
@@ -12,7 +12,6 @@ import {
SentenceSplitter,
} from "@llamaindex/core/node-parser";
import { AsyncLocalStorage } from "@llamaindex/env";
import type { ServiceContext } from "./ServiceContext.js";
export type PromptConfig = {
llm?: string;
@@ -163,42 +162,4 @@ class GlobalSettings implements Config {
}
}
export const llmFromSettingsOrContext = (serviceContext?: ServiceContext) => {
if (serviceContext?.llm) {
return serviceContext.llm;
}
return Settings.llm;
};
export const nodeParserFromSettingsOrContext = (
serviceContext?: ServiceContext,
) => {
if (serviceContext?.nodeParser) {
return serviceContext.nodeParser;
}
return Settings.nodeParser;
};
export const embedModelFromSettingsOrContext = (
serviceContext?: ServiceContext,
) => {
if (serviceContext?.embedModel) {
return serviceContext.embedModel;
}
return Settings.embedModel;
};
export const promptHelperFromSettingsOrContext = (
serviceContext?: ServiceContext,
) => {
if (serviceContext?.promptHelper) {
return serviceContext.promptHelper;
}
return Settings.promptHelper;
};
export const Settings = new GlobalSettings();
@@ -1,7 +0,0 @@
import { AnthropicAgent } from "@llamaindex/anthropic";
import { withContextAwareness } from "./contextAwareMixin.js";
export const AnthropicContextAwareAgent = withContextAwareness(AnthropicAgent);
export type { ContextAwareConfig } from "./contextAwareMixin.js";
export * from "@llamaindex/anthropic";
@@ -1,7 +1,3 @@
import {
AnthropicAgent,
type AnthropicAgentParams,
} from "@llamaindex/anthropic";
import type {
NonStreamingChatEngineParams,
StreamingChatEngineParams,
@@ -20,29 +16,21 @@ export interface ContextAwareState {
retrievedContext: string | null;
}
export type SupportedAgent = typeof OpenAIAgent | typeof AnthropicAgent;
export type AgentParams<T> = T extends typeof OpenAIAgent
? OpenAIAgentParams
: T extends typeof AnthropicAgent
? AnthropicAgentParams
: never;
// TODO: support any LLMAgent
export type SupportedAgent = typeof OpenAIAgent;
export type AgentParams = OpenAIAgentParams;
/**
* ContextAwareAgentRunner enhances the base AgentRunner with the ability to retrieve and inject relevant context
* for each query. This allows the agent to access and utilize appropriate information from a given index or retriever,
* providing more informed and context-specific responses to user queries.
*/
export function withContextAwareness<T extends SupportedAgent>(Base: T) {
export function withContextAwareness(Base: SupportedAgent) {
return class ContextAwareAgent extends Base {
public readonly contextRetriever: BaseRetriever;
public retrievedContext: string | null = null;
declare public chatHistory: T extends typeof OpenAIAgent
? OpenAIAgent["chatHistory"]
: T extends typeof AnthropicAgent
? AnthropicAgent["chatHistory"]
: never;
constructor(params: AgentParams<T> & ContextAwareConfig) {
constructor(params: AgentParams & ContextAwareConfig) {
super(params);
this.contextRetriever = params.contextRetriever;
}
+2 -17
View File
@@ -1,21 +1,6 @@
export * from "@llamaindex/core/agent";
export {
OllamaAgent,
OllamaAgentWorker,
type OllamaAgentParams,
} from "@llamaindex/ollama";
export {
AnthropicAgent,
AnthropicAgentWorker,
AnthropicContextAwareAgent,
type AnthropicAgentParams,
} from "./anthropic.js";
export {
OpenAIAgent,
OpenAIAgentWorker,
OpenAIContextAwareAgent,
type OpenAIAgentParams,
} from "./openai.js";
export { OpenAIContextAwareAgent } from "./openai.js";
export {
ReACTAgentWorker,
ReActAgent,
-3
View File
@@ -1,5 +1,3 @@
import type { ServiceContext } from "../ServiceContext.js";
export type ClientParams = {
apiKey?: string | undefined;
baseUrl?: string | undefined;
@@ -9,5 +7,4 @@ export type CloudConstructorParams = {
name: string;
projectName: string;
organizationId?: string | undefined;
serviceContext?: ServiceContext | undefined;
} & ClientParams;
@@ -1 +0,0 @@
export * from "@llamaindex/clip";
@@ -1 +0,0 @@
export * from "@llamaindex/deepinfra";
@@ -1 +0,0 @@
export { GEMINI_EMBEDDING_MODEL, GeminiEmbedding } from "@llamaindex/google";
@@ -1 +0,0 @@
export * from "@llamaindex/huggingface";
@@ -1,4 +0,0 @@
export {
MistralAIEmbedding,
MistralAIEmbeddingModelType,
} from "@llamaindex/mistral";
@@ -1,4 +0,0 @@
export {
MixedbreadAIEmbeddings,
type MixedbreadAIEmbeddingsParams,
} from "@llamaindex/mixedbread";
@@ -1 +0,0 @@
export { OllamaEmbedding } from "@llamaindex/ollama";
@@ -1,12 +1,5 @@
export * from "@llamaindex/core/embeddings";
export { ClipEmbedding, ClipEmbeddingModelType } from "./ClipEmbedding.js";
export { DeepInfraEmbedding } from "./DeepInfraEmbedding.js";
export { FireworksEmbedding } from "./fireworks.js";
export { GEMINI_EMBEDDING_MODEL, GeminiEmbedding } from "./GeminiEmbedding.js";
export * from "./HuggingFaceEmbedding.js";
export * from "./JinaAIEmbedding.js";
export * from "./MistralAIEmbedding.js";
export * from "./MixedbreadAIEmbeddings.js";
export { OllamaEmbedding } from "./OllamaEmbedding.js";
export * from "./OpenAIEmbedding.js";
export { TogetherEmbedding } from "./together.js";
@@ -18,8 +18,7 @@ import {
messagesToHistory,
streamReducer,
} from "@llamaindex/core/utils";
import type { ServiceContext } from "../../ServiceContext.js";
import { llmFromSettingsOrContext } from "../../Settings.js";
import { Settings } from "../../Settings.js";
/**
* CondenseQuestionChatEngine is used in conjunction with a Index (for example VectorStoreIndex).
@@ -44,7 +43,6 @@ export class CondenseQuestionChatEngine extends BaseChatEngine {
constructor(init: {
queryEngine: BaseQueryEngine;
chatHistory: ChatMessage[];
serviceContext?: ServiceContext;
condenseMessagePrompt?: CondenseQuestionPrompt;
}) {
super();
@@ -53,7 +51,7 @@ export class CondenseQuestionChatEngine extends BaseChatEngine {
this.memory = new ChatMemoryBuffer({
chatHistory: init?.chatHistory,
});
this.llm = llmFromSettingsOrContext(init?.serviceContext);
this.llm = Settings.llm;
this.condenseMessagePrompt =
init?.condenseMessagePrompt ?? defaultCondenseQuestionPrompt;
}
@@ -9,10 +9,9 @@ import {
} from "@llamaindex/core/response-synthesizers";
import { EngineResponse, type NodeWithScore } from "@llamaindex/core/schema";
import { extractText } from "@llamaindex/core/utils";
import type { ServiceContext } from "../../ServiceContext.js";
import { llmFromSettingsOrContext } from "../../Settings.js";
import type { BaseSelector } from "../../selectors/index.js";
import { LLMSingleSelector } from "../../selectors/index.js";
import { Settings } from "../../Settings.js";
type RouterQueryEngineTool = {
queryEngine: BaseQueryEngine;
@@ -60,7 +59,6 @@ export class RouterQueryEngine extends BaseQueryEngine {
constructor(init: {
selector: BaseSelector;
queryEngineTools: RouterQueryEngineTool[];
serviceContext?: ServiceContext | undefined;
summarizer?: BaseSynthesizer | undefined;
verbose?: boolean | undefined;
}) {
@@ -106,20 +104,16 @@ export class RouterQueryEngine extends BaseQueryEngine {
static fromDefaults(init: {
queryEngineTools: RouterQueryEngineTool[];
selector?: BaseSelector;
serviceContext?: ServiceContext;
summarizer?: BaseSynthesizer;
verbose?: boolean;
}) {
const serviceContext = init.serviceContext;
return new RouterQueryEngine({
selector:
init.selector ??
new LLMSingleSelector({
llm: llmFromSettingsOrContext(serviceContext),
llm: Settings.llm,
}),
queryEngineTools: init.queryEngineTools,
serviceContext,
summarizer: init.summarizer,
verbose: init.verbose,
});
@@ -2,7 +2,6 @@ import type { BaseSynthesizer } from "@llamaindex/core/response-synthesizers";
import { getResponseSynthesizer } from "@llamaindex/core/response-synthesizers";
import { TextNode, type NodeWithScore } from "@llamaindex/core/schema";
import { LLMQuestionGenerator } from "../../QuestionGenerator.js";
import type { ServiceContext } from "../../ServiceContext.js";
import type { BaseTool, ToolMetadata } from "@llamaindex/core/llms";
import type { PromptsRecord } from "@llamaindex/core/prompts";
@@ -93,7 +92,6 @@ export class SubQuestionQueryEngine extends BaseQueryEngine {
queryEngineTools: BaseTool[];
questionGen?: BaseQuestionGenerator;
responseSynthesizer?: BaseSynthesizer;
serviceContext?: ServiceContext;
}) {
const questionGen = init.questionGen ?? new LLMQuestionGenerator();
const responseSynthesizer =
@@ -2,8 +2,7 @@ import type { ChatMessage, LLM } from "@llamaindex/core/llms";
import { PromptMixin } from "@llamaindex/core/prompts";
import { MetadataMode } from "@llamaindex/core/schema";
import { extractText } from "@llamaindex/core/utils";
import type { ServiceContext } from "../ServiceContext.js";
import { llmFromSettingsOrContext } from "../Settings.js";
import { Settings } from "../Settings.js";
import type { CorrectnessSystemPrompt } from "./prompts.js";
import {
defaultCorrectnessSystemPrompt,
@@ -18,7 +17,6 @@ import type {
import { defaultEvaluationParser } from "./utils.js";
type CorrectnessParams = {
serviceContext?: ServiceContext;
scoreThreshold?: number;
parserFunction?: (str: string) => [number, string];
};
@@ -35,7 +33,7 @@ export class CorrectnessEvaluator extends PromptMixin implements BaseEvaluator {
constructor(params?: CorrectnessParams) {
super();
this.llm = llmFromSettingsOrContext(params?.serviceContext);
this.llm = Settings.llm;
this.correctnessPrompt = defaultCorrectnessSystemPrompt;
this.scoreThreshold = params?.scoreThreshold ?? 4.0;
this.parserFunction = params?.parserFunction ?? defaultEvaluationParser;
@@ -1,7 +1,6 @@
import { PromptMixin, type ModuleRecord } from "@llamaindex/core/prompts";
import { Document, MetadataMode } from "@llamaindex/core/schema";
import { extractText } from "@llamaindex/core/utils";
import type { ServiceContext } from "../ServiceContext.js";
import { SummaryIndex } from "../indices/summary/index.js";
import type {
FaithfulnessRefinePrompt,
@@ -22,19 +21,16 @@ export class FaithfulnessEvaluator
extends PromptMixin
implements BaseEvaluator
{
private serviceContext?: ServiceContext | undefined;
private raiseError: boolean;
private evalTemplate: FaithfulnessTextQAPrompt;
private refineTemplate: FaithfulnessRefinePrompt;
constructor(params?: {
serviceContext?: ServiceContext | undefined;
raiseError?: boolean | undefined;
faithfulnessSystemPrompt?: FaithfulnessTextQAPrompt | undefined;
faithFulnessRefinePrompt?: FaithfulnessRefinePrompt | undefined;
}) {
super();
this.serviceContext = params?.serviceContext;
this.raiseError = params?.raiseError ?? false;
this.evalTemplate =
@@ -92,9 +88,7 @@ export class FaithfulnessEvaluator
const docs = contexts?.map((context) => new Document({ text: context }));
const index = await SummaryIndex.fromDocuments(docs, {
serviceContext: this.serviceContext,
});
const index = await SummaryIndex.fromDocuments(docs, {});
const queryEngine = index.asQueryEngine();
@@ -1,7 +1,6 @@
import { PromptMixin, type ModuleRecord } from "@llamaindex/core/prompts";
import { Document, MetadataMode } from "@llamaindex/core/schema";
import { extractText } from "@llamaindex/core/utils";
import type { ServiceContext } from "../ServiceContext.js";
import { SummaryIndex } from "../indices/summary/index.js";
import type { RelevancyEvalPrompt, RelevancyRefinePrompt } from "./prompts.js";
import {
@@ -16,14 +15,12 @@ import type {
} from "./types.js";
type RelevancyParams = {
serviceContext?: ServiceContext | undefined;
raiseError?: boolean | undefined;
evalTemplate?: RelevancyEvalPrompt | undefined;
refineTemplate?: RelevancyRefinePrompt | undefined;
};
export class RelevancyEvaluator extends PromptMixin implements BaseEvaluator {
private serviceContext?: ServiceContext | undefined;
private raiseError: boolean;
private evalTemplate: RelevancyEvalPrompt;
@@ -32,7 +29,6 @@ export class RelevancyEvaluator extends PromptMixin implements BaseEvaluator {
constructor(params?: RelevancyParams) {
super();
this.serviceContext = params?.serviceContext;
this.raiseError = params?.raiseError ?? false;
this.evalTemplate = params?.evalTemplate ?? defaultRelevancyEvalPrompt;
this.refineTemplate =
@@ -78,9 +74,7 @@ export class RelevancyEvaluator extends PromptMixin implements BaseEvaluator {
const docs = contexts?.map((context) => new Document({ text: context }));
const index = await SummaryIndex.fromDocuments(docs, {
serviceContext: this.serviceContext,
});
const index = await SummaryIndex.fromDocuments(docs, {});
const queryResponse = `Question: ${extractText(query)}\nResponse: ${response}`;
-2
View File
@@ -32,7 +32,6 @@ export {
DEFAULT_CONTEXT_WINDOW,
DEFAULT_DOC_STORE_PERSIST_FILENAME,
DEFAULT_GRAPH_STORE_PERSIST_FILENAME,
DEFAULT_IMAGE_VECTOR_NAMESPACE,
DEFAULT_INDEX_STORE_PERSIST_FILENAME,
DEFAULT_NAMESPACE,
DEFAULT_NUM_OUTPUTS,
@@ -83,7 +82,6 @@ export * from "./OutputParser.js";
export * from "./postprocessors/index.js";
export * from "./QuestionGenerator.js";
export * from "./selectors/index.js";
export * from "./ServiceContext.js";
export * from "./storage/StorageContext.js";
export * from "./tools/index.js";
export * from "./types.js";
+3 -15
View File
@@ -1,21 +1,9 @@
export * from "./index.edge.js";
export * from "./readers/index.js";
export * from "./storage/index.js";
// Exports modules that doesn't support non-node.js runtime
export {
HuggingFaceEmbedding,
HuggingFaceEmbeddingModelType,
} from "./embeddings/HuggingFaceEmbedding.js";
export {
GeminiVertexSession,
type VertexGeminiSessionOptions,
} from "@llamaindex/google";
// Expose AzureDynamicSessionTool for node.js runtime only
export { AzureDynamicSessionTool } from "@llamaindex/azure";
// TODO: clean up, move to jinaai package
export { JinaAIEmbedding } from "./embeddings/JinaAIEmbedding.js";
// Don't export vector store modules for non-node.js runtime on top level,
// Don't export file-system stores for non-node.js runtime on top level,
// as we cannot guarantee that they will work in other environments
export * from "./storage/index.js";
export * from "./vector-store.js";
+14 -9
View File
@@ -1,16 +1,18 @@
import type {
BaseChatEngine,
ContextChatEngineOptions,
} from "@llamaindex/core/chat-engine";
import type { BaseQueryEngine } from "@llamaindex/core/query-engine";
import type { BaseSynthesizer } from "@llamaindex/core/response-synthesizers";
import type { BaseRetriever } from "@llamaindex/core/retriever";
import type { BaseNode, Document } from "@llamaindex/core/schema";
import type { BaseDocumentStore } from "@llamaindex/core/storage/doc-store";
import type { BaseIndexStore } from "@llamaindex/core/storage/index-store";
import type { ServiceContext } from "../ServiceContext.js";
import { nodeParserFromSettingsOrContext } from "../Settings.js";
import { runTransformations } from "../ingestion/IngestionPipeline.js";
import { Settings } from "../Settings.js";
import type { StorageContext } from "../storage/StorageContext.js";
export interface BaseIndexInit<T> {
serviceContext?: ServiceContext | undefined;
storageContext: StorageContext;
docStore: BaseDocumentStore;
indexStore?: BaseIndexStore | undefined;
@@ -22,14 +24,12 @@ export interface BaseIndexInit<T> {
* they can be retrieved for our queries.
*/
export abstract class BaseIndex<T> {
serviceContext?: ServiceContext | undefined;
storageContext: StorageContext;
docStore: BaseDocumentStore;
indexStore?: BaseIndexStore | undefined;
indexStruct: T;
constructor(init: BaseIndexInit<T>) {
this.serviceContext = init.serviceContext;
this.storageContext = init.storageContext;
this.docStore = init.docStore;
this.indexStore = init.indexStore;
@@ -53,15 +53,20 @@ export abstract class BaseIndex<T> {
responseSynthesizer?: BaseSynthesizer;
}): BaseQueryEngine;
/**
* Create a new chat engine from the index.
* @param options
*/
abstract asChatEngine(
options?: Omit<ContextChatEngineOptions, "retriever">,
): BaseChatEngine;
/**
* Insert a document into the index.
* @param document
*/
async insert(document: Document) {
const nodes = await runTransformations(
[document],
[nodeParserFromSettingsOrContext(this.serviceContext)],
);
const nodes = await runTransformations([document], [Settings.nodeParser]);
await this.insertNodes(nodes);
await this.docStore.setDocumentHash(document.id_, document.hash);
}
@@ -5,8 +5,6 @@ import type {
NodeWithScore,
} from "@llamaindex/core/schema";
import { MetadataMode } from "@llamaindex/core/schema";
import type { ServiceContext } from "../../ServiceContext.js";
import { serviceContextFromDefaults } from "../../ServiceContext.js";
import { RetrieverQueryEngine } from "../../engines/query/index.js";
import type { StorageContext } from "../../storage/StorageContext.js";
import { storageContextFromDefaults } from "../../storage/StorageContext.js";
@@ -34,13 +32,17 @@ import type {
import { BaseRetriever } from "@llamaindex/core/retriever";
import type { BaseDocumentStore } from "@llamaindex/core/storage/doc-store";
import { extractText } from "@llamaindex/core/utils";
import { llmFromSettingsOrContext } from "../../Settings.js";
import { Settings } from "../../Settings.js";
import {
ContextChatEngine,
type BaseChatEngine,
type ContextChatEngineOptions,
} from "../../engines/chat/index.js";
export interface KeywordIndexOptions {
nodes?: BaseNode[];
indexStruct?: KeywordTable;
indexId?: string;
serviceContext?: ServiceContext;
llm?: LLM;
storageContext?: StorageContext;
}
@@ -79,7 +81,7 @@ abstract class BaseKeywordTableRetriever extends BaseRetriever {
this.index = index;
this.indexStruct = index.indexStruct;
this.docstore = index.docStore;
this.llm = llmFromSettingsOrContext(index.serviceContext);
this.llm = Settings.llm;
this.maxKeywordsPerQuery = maxKeywordsPerQuery;
this.numChunksPerQuery = numChunksPerQuery;
@@ -152,6 +154,10 @@ const KeywordTableRetrieverMap = {
[KeywordTableRetrieverMode.RAKE]: KeywordTableRAKERetriever,
};
export type KeywordTableIndexChatEngineOptions = {
retriever?: BaseRetriever;
} & Omit<ContextChatEngineOptions, "retriever">;
/**
* The KeywordTableIndex, an index that extracts keywords from each Node and builds a mapping from each keyword to the corresponding Nodes of that keyword.
*/
@@ -163,7 +169,6 @@ export class KeywordTableIndex extends BaseIndex<KeywordTable> {
static async init(options: KeywordIndexOptions): Promise<KeywordTableIndex> {
const storageContext =
options.storageContext ?? (await storageContextFromDefaults({}));
const serviceContext = options.serviceContext;
const { docStore, indexStore } = storageContext;
// Setup IndexStruct from storage
@@ -210,7 +215,6 @@ export class KeywordTableIndex extends BaseIndex<KeywordTable> {
indexStruct = await KeywordTableIndex.buildIndexFromNodes(
options.nodes,
storageContext.docStore,
serviceContext,
);
await indexStore.addIndexStruct(indexStruct);
@@ -218,7 +222,6 @@ export class KeywordTableIndex extends BaseIndex<KeywordTable> {
return new KeywordTableIndex({
storageContext,
serviceContext,
docStore,
indexStore,
indexStruct,
@@ -251,11 +254,16 @@ export class KeywordTableIndex extends BaseIndex<KeywordTable> {
);
}
static async extractKeywords(
text: string,
serviceContext?: ServiceContext,
): Promise<Set<string>> {
const llm = llmFromSettingsOrContext(serviceContext);
asChatEngine(options?: KeywordTableIndexChatEngineOptions): BaseChatEngine {
const { retriever, ...contextChatEngineOptions } = options ?? {};
return new ContextChatEngine({
retriever: retriever ?? this.asRetriever(),
...contextChatEngineOptions,
});
}
static async extractKeywords(text: string): Promise<Set<string>> {
const llm = Settings.llm;
const response = await llm.complete({
prompt: defaultKeywordExtractPrompt.format({
@@ -271,19 +279,16 @@ export class KeywordTableIndex extends BaseIndex<KeywordTable> {
* @param documents
* @param args
* @param args.storageContext
* @param args.serviceContext
* @returns
*/
static async fromDocuments(
documents: Document[],
args: {
storageContext?: StorageContext;
serviceContext?: ServiceContext;
} = {},
): Promise<KeywordTableIndex> {
let { storageContext, serviceContext } = args;
let { storageContext } = args;
storageContext = storageContext ?? (await storageContextFromDefaults({}));
serviceContext = serviceContext ?? serviceContextFromDefaults({});
const docStore = storageContext.docStore;
await docStore.addDocuments(documents, true);
@@ -291,11 +296,10 @@ export class KeywordTableIndex extends BaseIndex<KeywordTable> {
await docStore.setDocumentHash(doc.id_, doc.hash);
}
const nodes = serviceContext.nodeParser.getNodesFromDocuments(documents);
const nodes = Settings.nodeParser.getNodesFromDocuments(documents);
const index = await KeywordTableIndex.init({
nodes,
storageContext,
serviceContext,
});
return index;
}
@@ -304,20 +308,17 @@ export class KeywordTableIndex extends BaseIndex<KeywordTable> {
* Get keywords for nodes and place them into the index.
* @param nodes
* @param docStore
* @param serviceContext
* @returns
*/
static async buildIndexFromNodes(
nodes: BaseNode[],
docStore: BaseDocumentStore,
serviceContext?: ServiceContext,
): Promise<KeywordTable> {
const indexStruct = new KeywordTable();
await docStore.addDocuments(nodes, true);
for (const node of nodes) {
const keywords = await KeywordTableIndex.extractKeywords(
node.getContent(MetadataMode.LLM),
serviceContext,
);
indexStruct.addNode([...keywords], node.id_);
}
@@ -328,7 +329,6 @@ export class KeywordTableIndex extends BaseIndex<KeywordTable> {
for (const node of nodes) {
const keywords = await KeywordTableIndex.extractKeywords(
node.getContent(MetadataMode.LLM),
this.serviceContext,
);
this.indexStruct.addNode([...keywords], node.id_);
}
@@ -19,11 +19,12 @@ import type {
} from "@llamaindex/core/storage/doc-store";
import { extractText } from "@llamaindex/core/utils";
import _ from "lodash";
import type { ServiceContext } from "../../ServiceContext.js";
import {
llmFromSettingsOrContext,
nodeParserFromSettingsOrContext,
} from "../../Settings.js";
import { Settings } from "../../Settings.js";
import type {
BaseChatEngine,
ContextChatEngineOptions,
} from "../../engines/chat/index.js";
import { ContextChatEngine } from "../../engines/chat/index.js";
import { RetrieverQueryEngine } from "../../engines/query/index.js";
import type { StorageContext } from "../../storage/StorageContext.js";
import { storageContextFromDefaults } from "../../storage/StorageContext.js";
@@ -44,11 +45,15 @@ export enum SummaryRetrieverMode {
LLM = "llm",
}
export type SummaryIndexChatEngineOptions = {
retriever?: BaseRetriever;
mode?: SummaryRetrieverMode;
} & Omit<ContextChatEngineOptions, "retriever">;
export interface SummaryIndexOptions {
nodes?: BaseNode[] | undefined;
indexStruct?: IndexList | undefined;
indexId?: string | undefined;
serviceContext?: ServiceContext | undefined;
storageContext?: StorageContext | undefined;
}
@@ -63,7 +68,6 @@ export class SummaryIndex extends BaseIndex<IndexList> {
static async init(options: SummaryIndexOptions): Promise<SummaryIndex> {
const storageContext =
options.storageContext ?? (await storageContextFromDefaults({}));
const serviceContext = options.serviceContext;
const { docStore, indexStore } = storageContext;
// Setup IndexStruct from storage
@@ -120,7 +124,6 @@ export class SummaryIndex extends BaseIndex<IndexList> {
return new SummaryIndex({
storageContext,
serviceContext,
docStore,
indexStore,
indexStruct,
@@ -131,11 +134,9 @@ export class SummaryIndex extends BaseIndex<IndexList> {
documents: Document[],
args: {
storageContext?: StorageContext | undefined;
serviceContext?: ServiceContext | undefined;
} = {},
): Promise<SummaryIndex> {
let { storageContext } = args;
const serviceContext = args.serviceContext;
storageContext = storageContext ?? (await storageContextFromDefaults({}));
const docStore = storageContext.docStore;
@@ -144,15 +145,11 @@ export class SummaryIndex extends BaseIndex<IndexList> {
await docStore.setDocumentHash(doc.id_, doc.hash);
}
const nodes =
nodeParserFromSettingsOrContext(serviceContext).getNodesFromDocuments(
documents,
);
const nodes = Settings.nodeParser.getNodesFromDocuments(documents);
const index = await SummaryIndex.init({
nodes,
storageContext,
serviceContext,
});
return index;
}
@@ -193,6 +190,16 @@ export class SummaryIndex extends BaseIndex<IndexList> {
);
}
asChatEngine(options?: SummaryIndexChatEngineOptions): BaseChatEngine {
const { retriever, mode, ...contextChatEngineOptions } = options ?? {};
return new ContextChatEngine({
retriever:
retriever ??
this.asRetriever({ mode: mode ?? SummaryRetrieverMode.DEFAULT }),
...contextChatEngineOptions,
});
}
static async buildIndexFromNodes(
nodes: BaseNode[],
docStore: BaseDocumentStore,
@@ -306,7 +313,6 @@ export class SummaryIndexLLMRetriever extends BaseRetriever {
choiceBatchSize: number;
formatNodeBatchFn: NodeFormatterFunction;
parseChoiceSelectAnswerFn: ChoiceSelectParserFunction;
serviceContext?: ServiceContext | undefined;
constructor(
index: SummaryIndex,
@@ -314,7 +320,6 @@ export class SummaryIndexLLMRetriever extends BaseRetriever {
choiceBatchSize: number = 10,
formatNodeBatchFn?: NodeFormatterFunction,
parseChoiceSelectAnswerFn?: ChoiceSelectParserFunction,
serviceContext?: ServiceContext,
) {
super();
this.index = index;
@@ -323,7 +328,6 @@ export class SummaryIndexLLMRetriever extends BaseRetriever {
this.formatNodeBatchFn = formatNodeBatchFn || defaultFormatNodeBatchFn;
this.parseChoiceSelectAnswerFn =
parseChoiceSelectAnswerFn || defaultParseChoiceSelectAnswerFn;
this.serviceContext = serviceContext || index.serviceContext;
}
async _retrieve(query: QueryBundle): Promise<NodeWithScore[]> {
@@ -337,7 +341,7 @@ export class SummaryIndexLLMRetriever extends BaseRetriever {
const fmtBatchStr = this.formatNodeBatchFn(nodesBatch);
const input = { context: fmtBatchStr, query: extractText(query) };
const llm = llmFromSettingsOrContext(this.serviceContext);
const llm = Settings.llm;
const rawResponse = (
await llm.complete({
@@ -1,3 +1,7 @@
import {
ContextChatEngine,
type ContextChatEngineOptions,
} from "@llamaindex/core/chat-engine";
import { IndexDict, IndexStructType } from "@llamaindex/core/data-structs";
import {
DEFAULT_SIMILARITY_TOP_K,
@@ -20,16 +24,15 @@ import {
import type { BaseIndexStore } from "@llamaindex/core/storage/index-store";
import { extractText } from "@llamaindex/core/utils";
import { VectorStoreQueryMode } from "@llamaindex/core/vector-store";
import type { ServiceContext } from "../../ServiceContext.js";
import { nodeParserFromSettingsOrContext } from "../../Settings.js";
import { Settings } from "../../Settings.js";
import { RetrieverQueryEngine } from "../../engines/query/RetrieverQueryEngine.js";
import {
addNodesToVectorStores,
runTransformations,
} from "../../ingestion/IngestionPipeline.js";
import {
DocStoreStrategy,
createDocStoreStrategy,
DocStoreStrategy,
} from "../../ingestion/strategies/index.js";
import type { StorageContext } from "../../storage/StorageContext.js";
import { storageContextFromDefaults } from "../../storage/StorageContext.js";
@@ -48,7 +51,6 @@ interface IndexStructOptions {
}
export interface VectorIndexOptions extends IndexStructOptions {
nodes?: BaseNode[] | undefined;
serviceContext?: ServiceContext | undefined;
storageContext?: StorageContext | undefined;
vectorStores?: VectorStoreByType | undefined;
logProgress?: boolean | undefined;
@@ -59,6 +61,12 @@ export interface VectorIndexConstructorProps extends BaseIndexInit<IndexDict> {
vectorStores?: VectorStoreByType | undefined;
}
export type VectorIndexChatEngineOptions = {
retriever?: BaseRetriever;
similarityTopK?: number;
preFilters?: MetadataFilters;
} & Omit<ContextChatEngineOptions, "retriever">;
/**
* The VectorStoreIndex, an index that stores the nodes only according to their vector embeddings.
*/
@@ -71,7 +79,7 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
super(init);
this.indexStore = init.indexStore;
this.vectorStores = init.vectorStores ?? init.storageContext.vectorStores;
this.embedModel = init.serviceContext?.embedModel;
this.embedModel = Settings.embedModel;
}
/**
@@ -84,7 +92,6 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
): Promise<VectorStoreIndex> {
const storageContext =
options.storageContext ?? (await storageContextFromDefaults({}));
const serviceContext = options.serviceContext;
const indexStore = storageContext.indexStore;
const docStore = storageContext.docStore;
@@ -103,7 +110,6 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
const index = new this({
storageContext,
serviceContext,
docStore,
indexStruct,
indexStore,
@@ -204,10 +210,7 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
} = {},
): Promise<VectorStoreIndex> {
args.storageContext =
args.storageContext ??
(await storageContextFromDefaults({
serviceContext: args.serviceContext,
}));
args.storageContext ?? (await storageContextFromDefaults({}));
args.vectorStores = args.vectorStores ?? args.storageContext.vectorStores;
args.docStoreStrategy =
args.docStoreStrategy ??
@@ -230,7 +233,7 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
);
args.nodes = await runTransformations(
documents,
[nodeParserFromSettingsOrContext(args.serviceContext)],
[Settings.nodeParser],
{},
{ docStoreStrategy },
);
@@ -245,10 +248,7 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
}
}
static async fromVectorStores(
vectorStores: VectorStoreByType,
serviceContext?: ServiceContext,
) {
static async fromVectorStores(vectorStores: VectorStoreByType) {
if (!vectorStores[ModalityType.TEXT]?.storesText) {
throw new Error(
"Cannot initialize from a vector store that does not store text",
@@ -262,20 +262,13 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
const index = await this.init({
nodes: [],
storageContext,
serviceContext,
});
return index;
}
static async fromVectorStore(
vectorStore: BaseVectorStore,
serviceContext?: ServiceContext,
) {
return this.fromVectorStores(
{ [ModalityType.TEXT]: vectorStore },
serviceContext,
);
static async fromVectorStore(vectorStore: BaseVectorStore) {
return this.fromVectorStores({ [ModalityType.TEXT]: vectorStore });
}
asRetriever(
@@ -309,6 +302,25 @@ export class VectorStoreIndex extends BaseIndex<IndexDict> {
);
}
/**
* Convert the index to a chat engine.
* @param options The options for creating the chat engine
* @returns A ContextChatEngine that uses the index's retriever to get context for each query
*/
asChatEngine(options: VectorIndexChatEngineOptions = {}) {
const {
retriever,
similarityTopK,
preFilters,
...contextChatEngineOptions
} = options;
return new ContextChatEngine({
retriever:
retriever ?? this.asRetriever({ similarityTopK, filters: preFilters }),
...contextChatEngineOptions,
});
}
protected async insertNodesToStore(
newIds: string[],
nodes: BaseNode[],
@@ -407,7 +419,6 @@ export class VectorIndexRetriever extends BaseRetriever {
index: VectorStoreIndex;
topK: TopKMap;
serviceContext?: ServiceContext | undefined;
filters?: MetadataFilters | undefined;
queryMode?: VectorStoreQueryMode | undefined;
@@ -415,7 +426,6 @@ export class VectorIndexRetriever extends BaseRetriever {
super();
this.index = options.index;
this.queryMode = options.mode ?? VectorStoreQueryMode.DEFAULT;
this.serviceContext = this.index.serviceContext;
if ("topK" in options && options.topK) {
this.topK = options.topK;
} else {
-1
View File
@@ -1 +0,0 @@
export * from "@llamaindex/anthropic";
-1
View File
@@ -1 +0,0 @@
export * from "@llamaindex/deepinfra";
-1
View File
@@ -1 +0,0 @@
export * from "@llamaindex/google";
-1
View File
@@ -1 +0,0 @@
export * from "@llamaindex/groq";
@@ -1 +0,0 @@
export * from "@llamaindex/huggingface";

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