mirror of
https://github.com/run-llama/LlamaIndexTS.git
synced 2026-07-15 14:55:41 -04:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 65958b2c2f | |||
| 6f3bf1b91f | |||
| f4588bc770 | |||
| b49037612d | |||
| a87efb91a4 | |||
| 6a4a73760b | |||
| 1564831158 | |||
| 4d94f6e50d | |||
| 7bd5d9340c | |||
| d924c63162 |
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@llamaindex/doc": patch
|
||||
---
|
||||
|
||||
docs: update chat engine docs
|
||||
@@ -0,0 +1,5 @@
|
||||
---
|
||||
"@llamaindex/doc": patch
|
||||
---
|
||||
|
||||
docs: update workflow doc
|
||||
@@ -0,0 +1,6 @@
|
||||
---
|
||||
"@llamaindex/core": patch
|
||||
"llamaindex": patch
|
||||
---
|
||||
|
||||
feat: asChatEngine function for index
|
||||
@@ -0,0 +1,7 @@
|
||||
---
|
||||
"llamaindex": minor
|
||||
"@llamaindex/cloudflare-hono": patch
|
||||
"@llamaindex/examples": patch
|
||||
---
|
||||
|
||||
Remove deprecated ServiceContext
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
"llamaindex": minor
|
||||
"@llamaindex/doc": minor
|
||||
"@llamaindex/examples": minor
|
||||
"@llamaindex/unit-test": minor
|
||||
---
|
||||
|
||||
Remove readers package from llamaindex
|
||||
@@ -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/*
|
||||
|
||||
@@ -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
@@ -1,3 +1 @@
|
||||
pnpm format
|
||||
pnpm lint
|
||||
npx lint-staged
|
||||
pnpm run lint-staged
|
||||
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
LlamaIndexTS
|
||||
Vendored
+2
-1
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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 +1,2 @@
|
||||
logs
|
||||
.temp
|
||||
|
||||
@@ -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 });
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -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,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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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,9 +1,9 @@
|
||||
import { OpenAIAgent } from "@llamaindex/openai";
|
||||
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
|
||||
import {
|
||||
FunctionTool,
|
||||
MetadataMode,
|
||||
NodeWithScore,
|
||||
SimpleDirectoryReader,
|
||||
VectorStoreIndex,
|
||||
} from "llamaindex";
|
||||
|
||||
|
||||
@@ -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,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 });
|
||||
|
||||
|
||||
@@ -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);
|
||||
@@ -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,4 +1,4 @@
|
||||
import { SimpleDirectoryReader } from "llamaindex";
|
||||
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
|
||||
|
||||
function callback(
|
||||
category: string,
|
||||
|
||||
+1
-2
@@ -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,9 +1,9 @@
|
||||
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
|
||||
import {
|
||||
ImageDocument,
|
||||
JinaAIEmbedding,
|
||||
similarity,
|
||||
SimilarityType,
|
||||
SimpleDirectoryReader,
|
||||
} from "llamaindex";
|
||||
import path from "path";
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,9 +1,9 @@
|
||||
import { OpenAI } from "@llamaindex/openai";
|
||||
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
|
||||
import {
|
||||
RouterQueryEngine,
|
||||
SentenceSplitter,
|
||||
Settings,
|
||||
SimpleDirectoryReader,
|
||||
SummaryIndex,
|
||||
VectorStoreIndex,
|
||||
} from "llamaindex";
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,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,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
|
||||
|
||||
@@ -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,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
@@ -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%);
|
||||
|
||||
@@ -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": [
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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,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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
Vendored
+1
-1
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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}`;
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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 +0,0 @@
|
||||
export * from "@llamaindex/anthropic";
|
||||
@@ -1 +0,0 @@
|
||||
export * from "@llamaindex/deepinfra";
|
||||
@@ -1 +0,0 @@
|
||||
export * from "@llamaindex/google";
|
||||
@@ -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
Reference in New Issue
Block a user