Compare commits

..

4 Commits

Author SHA1 Message Date
Alex Yang 8a9ae69390 Merge branch 'main' into ms/add-chat-ui-example 2024-11-07 09:36:22 -08:00
Marcus Schiesser 46cd22b716 Merge branch 'main' into ms/add-chat-ui-example 2024-11-07 15:27:20 +08:00
Marcus Schiesser f60574c3f3 feat: add chat-ui example to new docs 2024-11-07 15:12:05 +08:00
Marcus Schiesser b6085183fa feat: Add example using chat-ui components 2024-11-05 17:21:18 +07:00
301 changed files with 4361 additions and 5072 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"chat-ui": patch
---
Add example using chat-ui components
+5
View File
@@ -0,0 +1,5 @@
---
"@llamaindex/community": patch
---
feat: added support for Haiku 3.5 via Bedrock
+1 -1
View File
@@ -119,7 +119,7 @@ jobs:
run: pnpm run build
- name: Build ${{ matrix.packages }}
run: pnpm run build
working-directory: e2e/examples/${{ matrix.packages }}
working-directory: packages/llamaindex/e2e/examples/${{ matrix.packages }}
typecheck-examples:
runs-on: ubuntu-latest
+62 -34
View File
@@ -2,58 +2,86 @@
## Structure
LlamaIndex.TS uses pnpm monorepo.
This is a monorepo built with Turborepo
We recommend you to understand the basics of Node.js, TypeScript, pnpm, and of course, LLM before contributing.
Right now, for first-time contributors, these three packages are of the highest importance:
There are some important folders in the repository:
- `packages/llamaindex` which is the main NPM library `llamaindex`
- `examples` is where the demo code lives
- `apps/docs` is where the code for the documentation of https://ts.llamaindex.ai/ is located
- `packages/*`: Contains the source code of the packages. Each package is a separate npm package.
- `llamaindex`: The starter package for LlamaIndex.TS, which contains the all sub-packages.
- `core`: The core package of LlamaIndex.TS, which contains the abstract classes and interfaces. It is designed for
all JS runtime environments.
- `env`: The environment package of LlamaIndex.TS, which contains the environment-specific classes and interfaces. It
includes compatibility layers for Node.js, Deno, Vercel Edge Runtime, Cloudflare Workers...
- `apps/*`: The applications based on LlamaIndex.TS.
- `next`: Our documentation website based on Next.js.
- `examples`: The code examples of LlamaIndex.TS using Node.js.
### Turborepo docs
You can checkout how Turborepo works using the default [README-turborepo.md](/README-turborepo.md)
## Getting Started
Make sure you have Node.js LIS (Long-term Support) installed. You can check your Node.js version by running:
Install NodeJS. Preferably v18 using nvm or n.
Inside the LlamaIndexTS directory:
```shell
node -v
# v20.x.x
```
### Use pnpm
```shell
corepack enable
```
### Install dependencies
```shell
npm i -g pnpm ts-node
pnpm install
```
### Build the packages
Note: we use pnpm in this repo, which has a lot of the same functionality and CLI options as npm but it does do some things better in a monorepo, like centralizing dependencies and caching.
```shell
# Build all packages
turbo build --filter "./packages/*"
PNPM's has documentation on its [workspace feature](https://pnpm.io/workspaces) and Turborepo had some [useful documentation also](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks).
### Running Typescript
When we publish to NPM we will have a tsc compiled version of the library in JS. For now, the easiest thing to do is use ts-node.
### Test cases
To run them, run
```
pnpm run test
```
To write new test cases write them in [packages/llamaindex/tests](/packages/llamaindex/tests)
We use Vitest https://vitest.dev to write our test cases. Vitest comes with a bunch of built-in assertions using the expect function: https://vitest.dev/api/expect.html#expect
### Demo applications
There is an existing ["example"](/examples/README.md) demos folder with mainly NodeJS scripts. Feel free to add additional demos to that folder. If you would like to try out your changes in the `llamaindex` package with a new demo, you need to run the build command in the README.
You can create new demo applications in the apps folder. Just run pnpm init in the folder after you create it to create its own package.json
### Installing packages
To install packages for a specific package or demo application, run
```
pnpm add [NPM Package] --filter [package or application i.e. llamaindex or docs]
```
To install packages for every package or application run
```
pnpm add -w [NPM Package]
```
### Docs
See the [docs](./apps/next/README.md) for more information.
To contribute to the docs, go to the docs website folder and run the Docusaurus instance.
```bash
cd apps/docs
pnpm install
pnpm start
```
That should start a webserver which will serve the docs on https://localhost:3000
Any changes you make should be reflected in the browser. If you need to regenerate the API docs and find that your TSDoc isn't getting the updates, feel free to remove apps/docs/api. It will automatically regenerate itself when you run pnpm start again.
## Changeset
We use [changesets](https://github.com/changesets/changesets) for managing versions and changelogs. To create a new
changeset, run in the root folder:
We use [changesets](https://github.com/changesets/changesets) for managing versions and changelogs. To create a new changeset, run in the root folder:
```
pnpm changeset
@@ -67,6 +95,6 @@ The [Release Github Action](.github/workflows/release.yml) is automatically gene
PR called "Release {version}".
This PR will update the `package.json` and `CHANGELOG.md` files of each package according to
the current changesets in the [.changeset](.changeset) folder.
the current changesets in the [.changeset](.changeset/) folder.
If this PR is merged it will automatically add version tags to the repository and publish the updated packages to NPM.
-38
View File
@@ -1,43 +1,5 @@
# docs
## 0.0.113
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 0.0.112
### Patch Changes
- Updated dependencies [ad85bd0]
- llamaindex@0.8.8
- @llamaindex/examples@0.0.13
## 0.0.111
### Patch Changes
- llamaindex@0.8.7
## 0.0.110
### Patch Changes
- Updated dependencies [95a5cc6]
- llamaindex@0.8.6
## 0.0.109
### Patch Changes
- Updated dependencies [14cc9eb]
- Updated dependencies [a6db5dd]
- Updated dependencies [396b1e1]
- llamaindex@0.8.5
## 0.0.108
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "docs",
"version": "0.0.113",
"version": "0.0.108",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
-63
View File
@@ -1,68 +1,5 @@
# @llamaindex/doc
## 0.0.11
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
- @llamaindex/cloud@2.0.6
- @llamaindex/core@0.4.6
- @llamaindex/node-parser@0.0.7
- @llamaindex/openai@0.1.31
- @llamaindex/readers@1.0.7
## 0.0.10
### Patch Changes
- Updated dependencies [ad85bd0]
- @llamaindex/core@0.4.5
- llamaindex@0.8.8
- @llamaindex/node-parser@0.0.6
- @llamaindex/workflow@0.0.3
- @llamaindex/cloud@2.0.5
- @llamaindex/openai@0.1.30
- @llamaindex/readers@1.0.6
## 0.0.9
### Patch Changes
- @llamaindex/cloud@2.0.4
- @llamaindex/core@0.4.4
- llamaindex@0.8.7
- @llamaindex/node-parser@0.0.5
- @llamaindex/openai@0.1.29
- @llamaindex/readers@1.0.5
## 0.0.8
### Patch Changes
- Updated dependencies [95a5cc6]
- @llamaindex/core@0.4.3
- llamaindex@0.8.6
- @llamaindex/cloud@2.0.3
- @llamaindex/node-parser@0.0.4
- @llamaindex/openai@0.1.28
- @llamaindex/readers@1.0.4
## 0.0.7
### Patch Changes
- Updated dependencies [14cc9eb]
- Updated dependencies [a6db5dd]
- Updated dependencies [396b1e1]
- llamaindex@0.8.5
- @llamaindex/cloud@2.0.2
- @llamaindex/core@0.4.2
- @llamaindex/node-parser@0.0.3
- @llamaindex/openai@0.1.27
- @llamaindex/readers@1.0.3
## 0.0.6
### Patch Changes
+8 -3
View File
@@ -1,4 +1,4 @@
# Docs
# next
This is a Next.js application generated with
[Create Fumadocs](https://github.com/fuma-nama/fumadocs).
@@ -6,10 +6,15 @@ This is a Next.js application generated with
Run development server:
```bash
turbo run dev
# turbo will build all required packages before running the dev server
npm run dev
# or
pnpm dev
# or
yarn dev
```
Open http://localhost:3000 with your browser to see the result.
## Learn More
To learn more about Next.js and Fumadocs, take a look at the following
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/doc",
"version": "0.0.11",
"version": "0.0.6",
"private": true,
"scripts": {
"build": "pnpm run build:docs && next build",
+15 -16
View File
@@ -25,16 +25,15 @@ export default function HomePage() {
return (
<main className="container mx-auto px-4 py-12">
<h1 className="text-4xl md:text-6xl font-bold text-center mb-4">
Build context-augmented web apps using
Build RAG Web App using
<br /> <span className="text-blue-500">LlamaIndex.TS</span>
</h1>
<p className="text-xl text-center text-fd-muted-foreground mb-12 ">
LlamaIndex.TS is the JS/TS version of{" "}
<a href="https://llamaindex.ai">LlamaIndex</a>, the framework for
building agentic generative AI applications connected to your data.
LlamaIndex.TS is the JS/TS library from our popular Python library
llama-index for building LLM applications
</p>
<div className="text-center text-lg text-fd-muted-foreground mb-12">
<span>Designed for building web applications in </span>
<span>Designed for building web applications under </span>
<TextEffect />
</div>
@@ -59,8 +58,8 @@ export default function HomePage() {
<Feature
icon={Footprints}
subheading="Progressive"
heading="From the simplest to the most complex"
description="LlamaIndex.TS is designed to be simple to get started, but powerful enough to build complex, agentic AI applications."
heading="Adding AI feature from simple to complex"
description="LlamaIndex.TS is designed to be simple to start with and can be extended to build complex AI applications."
>
<Suspense
fallback={
@@ -114,9 +113,9 @@ const response = await agent.chat({
</Feature>
<Feature
icon={Bot}
subheading="Agents"
heading="Build agentic RAG applications"
description="Truly powerful retrieval-augmented generation applications use agentic techniques, and LlamaIndex.TS makes it easy to build them."
subheading="Agent"
heading="Build agent for RAG"
description="Build agents for RAG using LlamaIndex.TS. Agents are the core building blocks of RAG applications."
>
<CodeBlock
code={`import { FunctionTool } from "llamaindex";
@@ -138,19 +137,19 @@ await agent.chat('...');`}
<Feature
icon={Blocks}
subheading="Providers"
heading="LLMs, Data Loaders, Vector Stores and more!"
description="LlamaIndex.TS has hundreds of integrations to connect to your data, index it, and query it with LLMs."
heading="LLM / Data Loader / Vector Store"
description="LlamaIndex.TS provides various providers to turn your data into valuable insights."
>
<div className="mt-8 flex flex-col gap-8">
<div>
<h3 className="text-lg font-semibold text-fd-muted-foreground mb-2">
LLMs
LLM
</h3>
<InfiniteLLMProviders />
</div>
<div>
<h3 className="text-lg font-semibold text-fd-muted-foreground mb-2">
Vector Stores
Vector Store
</h3>
<InfiniteVectorStoreProviders />
</div>
@@ -158,8 +157,8 @@ await agent.chat('...');`}
</Feature>
<Feature
icon={Terminal}
subheading="create-llama CLI"
heading="Build a RAG app with a single command"
subheading="Create Llama CLI"
heading="CLI for starting RAG app with one line"
description="A command line tool to generate LlamaIndex apps, the easiest way to get started with LlamaIndex."
>
<div className="my-6">
+2 -1
View File
@@ -7,8 +7,9 @@ import { ReactElement } from "react";
export function Contributing(): ReactElement {
return (
<div className="flex flex-col items-center border-x border-t px-4 py-16 text-center">
<Heart className="mb-4" />
<h2 className="mb-4 text-xl font-semibold sm:text-2xl">
Made possible by you <Heart className="inline align-middle" />
Made Possible by You.
</h2>
<p className="mb-4 text-fd-muted-foreground">
LlamaIndex.TS is powered by the open source community.
@@ -53,6 +53,9 @@ export default async function ContributorCounter({
</div>
) : null}
</div>
<div className="text-center text-sm text-fd-muted-foreground">
Some of our best contributors.
</div>
</div>
);
}
@@ -93,35 +93,6 @@ See more about [moduleResolution](https://www.typescriptlang.org/docs/handbook/m
</Accordion>
</Accordions>
## Enable AsyncIterable for `Web Stream` API
Some modules uses `Web Stream` API like `ReadableStream` and `WritableStream`, you need to enable `DOM.AsyncIterable` in your `tsconfig.json`.
```json5
{
compilerOptions: {
// ⬇️ add this lib to your tsconfig.json
lib: ["DOM.AsyncIterable"],
},
}
```
```ts twoslash
import { OpenAIAgent } from '@llamaindex/openai'
const agent = new OpenAIAgent({
tools: []
})
const response = await agent.chat({
message: 'Hello, how are you?',
stream: true
})
for await (const _ of response) {
//^?
// ...
}
```
## Run TypeScript Script in Node.js
-8
View File
@@ -1,8 +0,0 @@
{
"extends": ["//"],
"tasks": {
"dev": {
"dependsOn": ["^build"]
}
}
}
-3
View File
@@ -1,3 +0,0 @@
import { OpenAI } from "./openai.js";
export class Ollama extends OpenAI {}
-35
View File
@@ -1,35 +0,0 @@
import { Ollama } from "@llamaindex/ollama";
import assert from "node:assert";
import { test } from "node:test";
import { getWeatherTool } from "./fixtures/tools.js";
import { mockLLMEvent } from "./utils.js";
await test("ollama", async (t) => {
await mockLLMEvent(t, "ollama");
await t.test("ollama function call", async (t) => {
const llm = new Ollama({
model: "llama3.2",
});
const chatResponse = await llm.chat({
messages: [
{
role: "user",
content: "What is the weather in Paris?",
},
],
tools: [getWeatherTool],
});
if (
chatResponse.message.options &&
"toolCall" in chatResponse.message.options
) {
assert.equal(chatResponse.message.options.toolCall.length, 1);
assert.equal(
chatResponse.message.options.toolCall[0]!.name,
getWeatherTool.metadata.name,
);
} else {
throw new Error("Expected tool calls in response");
}
});
});
-393
View File
@@ -1,393 +0,0 @@
{
"llmEventStart": [
{
"id": "PRESERVE_0",
"messages": [
{
"role": "user",
"content": "calculate 2 + 2"
}
]
},
{
"id": "PRESERVE_1",
"messages": [
{
"role": "user",
"content": "calculate 2 + 2"
},
{
"role": "assistant",
"content": "",
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": {
"a": 2,
"b": 2
}
}
]
}
},
{
"role": "user",
"content": "4",
"options": {
"toolResult": {
"result": "4",
"isError": false,
"id": "call_S2x0FUa475GVpNQJ796Rc9fd"
}
}
}
]
}
],
"llmEventEnd": [
{
"id": "PRESERVE_0",
"response": {
"raw": null,
"message": {
"content": "",
"role": "assistant",
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": {
"a": 2,
"b": 2
}
}
]
}
}
}
},
{
"id": "PRESERVE_1",
"response": {
"raw": null,
"message": {
"content": "The result of \\(2 + 2\\) is \\(4\\).",
"role": "assistant",
"options": {}
}
}
}
],
"llmEventStream": [
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": "{\"a\":2,\"b\":2}"
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_0",
"chunk": {
"raw": null,
"options": {
"toolCall": [
{
"name": "sumNumbers",
"id": "call_S2x0FUa475GVpNQJ796Rc9fd",
"input": {
"a": 2,
"b": 2
}
}
]
},
"delta": ""
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": "The"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": " result"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": " of"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": " \\("
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": "2"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": " +"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": " "
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": "2"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": "\\"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": ")"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": " is"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": " \\("
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": "4"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": "\\"
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": ")."
}
},
{
"id": "PRESERVE_1",
"chunk": {
"raw": null,
"options": {},
"delta": ""
}
}
]
}
-37
View File
@@ -1,37 +0,0 @@
{
"llmEventStart": [
{
"id": "PRESERVE_0",
"messages": [
{
"role": "user",
"content": "What is the weather in Paris?"
}
]
}
],
"llmEventEnd": [
{
"id": "PRESERVE_0",
"response": {
"message": {
"role": "assistant",
"content": "",
"options": {
"toolCall": [
{
"name": "getWeather",
"input": {
"city": "Paris"
},
"id": "5d198775-5268-4552-993b-9ecb4425385b"
}
]
}
},
"raw": null
}
}
],
"llmEventStream": []
}
-10
View File
@@ -1,15 +1,5 @@
# examples
## 0.0.13
### Patch Changes
- Updated dependencies [ad85bd0]
- @llamaindex/core@0.4.5
- llamaindex@0.8.8
- @llamaindex/workflow@0.0.3
- @llamaindex/readers@1.0.6
## 0.0.12
### Patch Changes
-71
View File
@@ -1,71 +0,0 @@
import "dotenv/config";
import {
DefaultAzureCredential,
getBearerTokenProvider,
} from "@azure/identity";
import {
AzureCosmosDBNoSqlVectorStore,
AzureCosmosNoSqlDocumentStore,
AzureCosmosNoSqlIndexStore,
Document,
OpenAI,
OpenAIEmbedding,
Settings,
storageContextFromDefaults,
VectorStoreIndex,
} from "llamaindex";
/**
* This example demonstrates how to use Azure CosmosDB with LlamaIndex.
* It uses Azure CosmosDB as IndexStore, DocumentStore, and VectorStore.
*
* To run this example, create an .env file under /examples and set the following environment variables:
*
* AZURE_OPENAI_ENDPOINT="https://AOAI-ACCOUNT.openai.azure.com" // Sample Azure OpenAI endpoint.
* AZURE_DEPLOYMENT_NAME="gpt-4o" // Sample Azure OpenAI deployment name.
* EMBEDDING_MODEL="text-embedding-3-large" // Sample Azure OpenAI embedding model.
* AZURE_COSMOSDB_NOSQL_ACCOUNT_ENDPOINT = "https://DB-ACCOUNT.documents.azure.com:443/" // Sample CosmosDB account endpoint.
*
* This example uses managed identity to authenticate with Azure CosmosDB and Azure OpenAI. Make sure to assign the required roles to the managed identity.
* You can also use connectionString for Azure CosmosDB and Keys with Azure OpenAI for authentication.
*/
(async () => {
const credential = new DefaultAzureCredential();
const azureADTokenProvider = getBearerTokenProvider(
credential,
"https://cognitiveservices.azure.com/.default",
);
const azure = {
azureADTokenProvider,
deployment: process.env.AZURE_DEPLOYMENT_NAME,
};
Settings.llm = new OpenAI({ azure });
Settings.embedModel = new OpenAIEmbedding({
model: process.env.EMBEDDING_MODEL,
azure: {
...azure,
deployment: process.env.EMBEDDING_MODEL,
},
});
const docStore = AzureCosmosNoSqlDocumentStore.fromAadToken();
console.log({ docStore });
const indexStore = AzureCosmosNoSqlIndexStore.fromAadToken();
console.log({ indexStore });
const vectorStore = AzureCosmosDBNoSqlVectorStore.fromUriAndManagedIdentity();
console.log({ vectorStore });
const storageContext = await storageContextFromDefaults({
docStore,
indexStore,
vectorStore,
});
console.log({ storageContext });
const document = new Document({ text: "Test Text" });
const index = await VectorStoreIndex.fromDocuments([document], {
storageContext,
logProgress: true,
});
console.log({ index });
})();
+24 -51
View File
@@ -6,21 +6,17 @@ import {
} from "@llamaindex/readers/cosmosdb";
import * as dotenv from "dotenv";
import {
AzureCosmosDBNoSQLConfig,
AzureCosmosDBNoSqlVectorStore,
OpenAI,
OpenAIEmbedding,
Settings,
storageContextFromDefaults,
VectorStoreIndex,
} from "llamaindex";
import {
createStoresFromConnectionString,
createStoresFromManagedIdentity,
} from "./utils";
// Load environment variables from local .env file
dotenv.config();
const cosmosEndpoint = process.env.AZURE_COSMOSDB_NOSQL_ACCOUNT_ENDPOINT!;
const cosmosEndpoint = process.env.AZURE_COSMOSDB_NOSQL_ENDPOINT!;
const cosmosConnectionString =
process.env.AZURE_COSMOSDB_NOSQL_CONNECTION_STRING!;
const databaseName =
@@ -30,7 +26,7 @@ const collectionName =
const vectorCollectionName =
process.env.AZURE_COSMOSDB_VECTOR_CONTAINER_NAME || "vectorContainer";
// This example uses Azure OpenAI llm and embedding models
// This exampple uses Azure OpenAI llm and embedding models
const llmInit = {
azure: {
apiVersion: process.env.AZURE_OPENAI_LLM_API_VERSION,
@@ -50,48 +46,24 @@ const embedModelInit = {
Settings.llm = new OpenAI(llmInit);
Settings.embedModel = new OpenAIEmbedding(embedModelInit);
// Initialize the CosmosDB client
async function initializeCosmosClient() {
if (cosmosConnectionString) {
return new CosmosClient(cosmosConnectionString);
} else {
const credential = new DefaultAzureCredential();
return new CosmosClient({
endpoint: cosmosEndpoint,
aadCredentials: credential,
});
}
}
// Initialize CosmosDB to be used as a vectorStore, docStore, and indexStore
async function initializeStores() {
// Create a configuration object for the Azure CosmosDB NoSQL Vector Store
const dbConfig: AzureCosmosDBNoSQLConfig = {
databaseName,
containerName: vectorCollectionName,
flatMetadata: false,
};
if (cosmosConnectionString) {
return createStoresFromConnectionString(cosmosConnectionString, dbConfig);
} else {
// Use managed identity to authenticate with Azure CosmosDB
const credential = new DefaultAzureCredential();
return createStoresFromManagedIdentity(
cosmosEndpoint,
credential,
dbConfig,
);
}
}
async function loadVectorData() {
if (!cosmosConnectionString && !cosmosEndpoint) {
throw new Error(
"Azure CosmosDB connection string or endpoint must be set.",
);
}
const cosmosClient = await initializeCosmosClient();
let cosmosClient: CosmosClient;
// initialize the cosmos client
if (cosmosConnectionString) {
cosmosClient = new CosmosClient(cosmosConnectionString);
} else {
cosmosClient = new CosmosClient({
endpoint: cosmosEndpoint,
aadCredentials: new DefaultAzureCredential(),
});
}
const reader = new SimpleCosmosDBReader(cosmosClient);
// create a configuration object for the reader
const simpleCosmosReaderConfig: SimpleCosmosDBReaderLoaderConfig = {
@@ -104,15 +76,16 @@ async function loadVectorData() {
// load objects from cosmos and convert them into LlamaIndex Document objects
const documents = await reader.loadData(simpleCosmosReaderConfig);
// use Azure CosmosDB as a vectorStore, docStore, and indexStore
const { vectorStore, docStore, indexStore } = await initializeStores();
// Store the embeddings in the CosmosDB container
const storageContext = await storageContextFromDefaults({
vectorStore,
docStore,
indexStore,
// create Azure CosmosDB as a vector store
const vectorStore = new AzureCosmosDBNoSqlVectorStore({
client: cosmosClient,
databaseName,
containerName: vectorCollectionName,
flatMetadata: false,
});
// Store the embeddings in the CosmosDB container
const storageContext = await storageContextFromDefaults({ vectorStore });
await VectorStoreIndex.fromDocuments(documents, { storageContext });
console.log(
`Successfully created embeddings in the CosmosDB container ${vectorCollectionName}.`,
+4 -38
View File
@@ -3,21 +3,17 @@ import { DefaultAzureCredential } from "@azure/identity";
import * as dotenv from "dotenv";
import {
AzureCosmosDBNoSQLConfig,
AzureCosmosDBNoSqlVectorStore,
OpenAI,
OpenAIEmbedding,
Settings,
storageContextFromDefaults,
VectorStoreIndex,
} from "llamaindex";
import {
createStoresFromConnectionString,
createStoresFromManagedIdentity,
} from "./utils";
// Load environment variables from local .env file
dotenv.config();
const cosmosEndpoint = process.env.AZURE_COSMOSDB_NOSQL_ACCOUNT_ENDPOINT!;
const cosmosEndpoint = process.env.AZURE_COSMOSDB_NOSQL_ENDPOINT!;
const cosmosConnectionString =
process.env.AZURE_COSMOSDB_NOSQL_CONNECTION_STRING!;
const databaseName =
@@ -44,27 +40,6 @@ const embedModelInit = {
Settings.llm = new OpenAI(llmInit);
Settings.embedModel = new OpenAIEmbedding(embedModelInit);
async function initializeStores() {
// Create a configuration object for the Azure CosmosDB NoSQL Vector Store
const dbConfig: AzureCosmosDBNoSQLConfig = {
databaseName,
containerName,
flatMetadata: false,
};
if (cosmosConnectionString) {
return createStoresFromConnectionString(cosmosConnectionString, dbConfig);
} else {
// Use managed identity to authenticate with Azure CosmosDB
const credential = new DefaultAzureCredential();
return createStoresFromManagedIdentity(
cosmosEndpoint,
credential,
dbConfig,
);
}
}
async function query() {
if (!cosmosConnectionString && !cosmosEndpoint) {
throw new Error(
@@ -90,19 +65,10 @@ async function query() {
containerName,
flatMetadata: false,
};
// use Azure CosmosDB as a vectorStore, docStore, and indexStore
const { vectorStore, docStore, indexStore } = await initializeStores();
// Store the embeddings in the CosmosDB container
const storageContext = await storageContextFromDefaults({
vectorStore,
docStore,
indexStore,
});
const store = new AzureCosmosDBNoSqlVectorStore(dbConfig);
// create an index from the Azure CosmosDB NoSQL Vector Store
const index = await VectorStoreIndex.init({ storageContext });
const index = await VectorStoreIndex.fromVectorStore(store);
// create a retriever and a query engine from the index
const retriever = index.asRetriever({ similarityTopK: 20 });
-51
View File
@@ -1,51 +0,0 @@
import { TokenCredential } from "@azure/identity";
import {
AzureCosmosDBNoSQLConfig,
AzureCosmosDBNoSqlVectorStore,
AzureCosmosNoSqlDocumentStore,
AzureCosmosNoSqlIndexStore,
} from "llamaindex";
/**
* Util function to create AzureCosmosDB vectorStore, docStore, indexStore from connection string.
*/
export const createStoresFromConnectionString = (
connectionString: string,
dbConfig: AzureCosmosDBNoSQLConfig,
) => {
const vectorStore = AzureCosmosDBNoSqlVectorStore.fromConnectionString({
connectionString,
...dbConfig,
});
const docStore = AzureCosmosNoSqlDocumentStore.fromConnectionString({
connectionString,
});
const indexStore = AzureCosmosNoSqlIndexStore.fromConnectionString({
connectionString,
});
return { vectorStore, docStore, indexStore };
};
/**
* Util function to create AzureCosmosDB vectorStore, docStore, indexStore from connection string.
*/
export const createStoresFromManagedIdentity = (
endpoint: string,
credential: TokenCredential,
dbConfig: AzureCosmosDBNoSQLConfig,
) => {
const vectorStore = AzureCosmosDBNoSqlVectorStore.fromUriAndManagedIdentity({
endpoint,
credential,
...dbConfig,
});
const docStore = AzureCosmosNoSqlDocumentStore.fromAadToken({
endpoint,
credential,
});
const indexStore = AzureCosmosNoSqlIndexStore.fromAadToken({
endpoint,
credential,
});
return { vectorStore, docStore, indexStore };
};
+5 -5
View File
@@ -1,15 +1,15 @@
{
"name": "@llamaindex/examples",
"private": true,
"version": "0.0.13",
"version": "0.0.12",
"dependencies": {
"@aws-crypto/sha256-js": "^5.2.0",
"@azure/cosmos": "^4.1.1",
"@azure/identity": "^4.4.1",
"@datastax/astra-db-ts": "^1.4.1",
"@llamaindex/core": "^0.4.5",
"@llamaindex/readers": "^1.0.6",
"@llamaindex/workflow": "^0.0.3",
"@llamaindex/core": "^0.4.0",
"@llamaindex/readers": "^1.0.0",
"@llamaindex/workflow": "^0.0.2",
"@notionhq/client": "^2.2.15",
"@pinecone-database/pinecone": "^3.0.2",
"@vercel/postgres": "^0.10.0",
@@ -18,7 +18,7 @@
"commander": "^12.1.0",
"dotenv": "^16.4.5",
"js-tiktoken": "^1.0.14",
"llamaindex": "^0.8.8",
"llamaindex": "^0.8.0",
"mongodb": "^6.7.0",
"pathe": "^1.1.2",
"postgres": "^3.4.4"
+1
View File
@@ -14,6 +14,7 @@ Settings.llm = new Ollama({
Settings.embedModel = new HuggingFaceEmbedding({
modelType: "BAAI/bge-small-en-v1.5",
quantized: false,
});
async function main() {
+6
View File
@@ -35,6 +35,12 @@
"typescript-eslint": "^8.13.0"
},
"packageManager": "pnpm@9.12.3",
"pnpm": {
"overrides": {
"trim": "1.0.1",
"protobufjs": "7.2.6"
}
},
"lint-staged": {
"(!apps/docs/i18n/**/docusaurus-plugin-content-docs/current/api/*).{js,jsx,ts,tsx,md}": "prettier --write"
}
-37
View File
@@ -1,42 +1,5 @@
# @llamaindex/autotool
## 5.0.9
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 5.0.8
### Patch Changes
- Updated dependencies [ad85bd0]
- llamaindex@0.8.8
## 5.0.7
### Patch Changes
- llamaindex@0.8.7
## 5.0.6
### Patch Changes
- Updated dependencies [95a5cc6]
- llamaindex@0.8.6
## 5.0.5
### Patch Changes
- Updated dependencies [14cc9eb]
- Updated dependencies [a6db5dd]
- Updated dependencies [396b1e1]
- llamaindex@0.8.5
## 5.0.4
### Patch Changes
@@ -1,47 +1,5 @@
# @llamaindex/autotool-01-node-example
## 0.0.52
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
- @llamaindex/autotool@5.0.9
## 0.0.51
### Patch Changes
- Updated dependencies [ad85bd0]
- llamaindex@0.8.8
- @llamaindex/autotool@5.0.8
## 0.0.50
### Patch Changes
- llamaindex@0.8.7
- @llamaindex/autotool@5.0.7
## 0.0.49
### Patch Changes
- Updated dependencies [95a5cc6]
- llamaindex@0.8.6
- @llamaindex/autotool@5.0.6
## 0.0.48
### Patch Changes
- Updated dependencies [14cc9eb]
- Updated dependencies [a6db5dd]
- Updated dependencies [396b1e1]
- llamaindex@0.8.5
- @llamaindex/autotool@5.0.5
## 0.0.47
### Patch Changes
@@ -13,5 +13,5 @@
"scripts": {
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
},
"version": "0.0.52"
"version": "0.0.47"
}
@@ -1,47 +1,5 @@
# @llamaindex/autotool-02-next-example
## 0.1.96
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
- @llamaindex/autotool@5.0.9
## 0.1.95
### Patch Changes
- Updated dependencies [ad85bd0]
- llamaindex@0.8.8
- @llamaindex/autotool@5.0.8
## 0.1.94
### Patch Changes
- llamaindex@0.8.7
- @llamaindex/autotool@5.0.7
## 0.1.93
### Patch Changes
- Updated dependencies [95a5cc6]
- llamaindex@0.8.6
- @llamaindex/autotool@5.0.6
## 0.1.92
### Patch Changes
- Updated dependencies [14cc9eb]
- Updated dependencies [a6db5dd]
- Updated dependencies [396b1e1]
- llamaindex@0.8.5
- @llamaindex/autotool@5.0.5
## 0.1.91
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/autotool-02-next-example",
"private": true,
"version": "0.1.96",
"version": "0.1.91",
"scripts": {
"dev": "next dev",
"build": "next build",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/autotool",
"type": "module",
"version": "5.0.9",
"version": "5.0.4",
"description": "auto transpile your JS function to LLM Agent compatible",
"files": [
"dist",
-39
View File
@@ -1,44 +1,5 @@
# @llamaindex/cloud
## 2.0.6
### Patch Changes
- Updated dependencies [4fc001c]
- @llamaindex/env@0.1.20
- @llamaindex/core@0.4.6
## 2.0.5
### Patch Changes
- Updated dependencies [ad85bd0]
- @llamaindex/core@0.4.5
- @llamaindex/env@0.1.19
## 2.0.4
### Patch Changes
- Updated dependencies [a8d3fa6]
- @llamaindex/env@0.1.18
- @llamaindex/core@0.4.4
## 2.0.3
### Patch Changes
- Updated dependencies [95a5cc6]
- @llamaindex/core@0.4.3
## 2.0.2
### Patch Changes
- Updated dependencies [14cc9eb]
- @llamaindex/env@0.1.17
- @llamaindex/core@0.4.2
## 2.0.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/cloud",
"version": "2.0.6",
"version": "2.0.1",
"type": "module",
"license": "MIT",
"scripts": {
+1
View File
@@ -8,6 +8,7 @@
"moduleResolution": "Bundler",
"skipLibCheck": true,
"strict": true,
"lib": ["DOM", "ESNext"],
"types": []
},
"include": ["./src"],
-46
View File
@@ -1,51 +1,5 @@
# @llamaindex/community
## 0.0.64
### Patch Changes
- Updated dependencies [4fc001c]
- @llamaindex/env@0.1.20
- @llamaindex/core@0.4.6
## 0.0.63
### Patch Changes
- Updated dependencies [ad85bd0]
- @llamaindex/core@0.4.5
- @llamaindex/env@0.1.19
## 0.0.62
### Patch Changes
- Updated dependencies [a8d3fa6]
- @llamaindex/env@0.1.18
- @llamaindex/core@0.4.4
## 0.0.61
### Patch Changes
- 487782c: Add missing inference endpoints for Haiku 3.5
- Updated dependencies [95a5cc6]
- @llamaindex/core@0.4.3
## 0.0.60
### Patch Changes
- Updated dependencies [14cc9eb]
- @llamaindex/env@0.1.17
- @llamaindex/core@0.4.2
## 0.0.59
### Patch Changes
- 47a7c3e: feat: added support for Haiku 3.5 via Bedrock
## 0.0.58
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/community",
"description": "Community package for LlamaIndexTS",
"version": "0.0.64",
"version": "0.0.58",
"type": "module",
"types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js",
@@ -87,7 +87,6 @@ export type BEDROCK_MODELS =
export const INFERENCE_BEDROCK_MODELS = {
US_ANTHROPIC_CLAUDE_3_HAIKU: "us.anthropic.claude-3-haiku-20240307-v1:0",
US_ANTHROPIC_CLAUDE_3_5_HAIKU: "us.anthropic.claude-3-5-haiku-20241022-v1:0",
US_ANTHROPIC_CLAUDE_3_OPUS: "us.anthropic.claude-3-opus-20240229-v1:0",
US_ANTHROPIC_CLAUDE_3_SONNET: "us.anthropic.claude-3-sonnet-20240229-v1:0",
US_ANTHROPIC_CLAUDE_3_5_SONNET:
@@ -100,7 +99,6 @@ export const INFERENCE_BEDROCK_MODELS = {
US_META_LLAMA_3_2_90B_INSTRUCT: "us.meta.llama3-2-90b-instruct-v1:0",
EU_ANTHROPIC_CLAUDE_3_HAIKU: "eu.anthropic.claude-3-haiku-20240307-v1:0",
EU_ANTHROPIC_CLAUDE_3_5_HAIKU: "eu.anthropic.claude-3-5-haiku-20240307-v1:0",
EU_ANTHROPIC_CLAUDE_3_SONNET: "eu.anthropic.claude-3-sonnet-20240229-v1:0",
EU_ANTHROPIC_CLAUDE_3_5_SONNET:
"eu.anthropic.claude-3-5-sonnet-20240620-v1:0",
@@ -125,8 +123,6 @@ export const INFERENCE_TO_BEDROCK_MAP: Record<
BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_5_SONNET,
[INFERENCE_BEDROCK_MODELS.US_ANTHROPIC_CLAUDE_3_5_SONNET_V2]:
BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_5_SONNET_V2,
[INFERENCE_BEDROCK_MODELS.US_ANTHROPIC_CLAUDE_3_5_HAIKU]:
BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_5_HAIKU,
[INFERENCE_BEDROCK_MODELS.US_META_LLAMA_3_2_1B_INSTRUCT]:
BEDROCK_MODELS.META_LLAMA3_2_1B_INSTRUCT,
[INFERENCE_BEDROCK_MODELS.US_META_LLAMA_3_2_3B_INSTRUCT]:
-36
View File
@@ -1,41 +1,5 @@
# @llamaindex/core
## 0.4.6
### Patch Changes
- Updated dependencies [4fc001c]
- @llamaindex/env@0.1.20
## 0.4.5
### Patch Changes
- ad85bd0: - fix agent chat message not saved into the task context when streaming
- fix async local storage might use `node:async_hook` in edge-light/workerd condition
- Updated dependencies [ad85bd0]
- @llamaindex/env@0.1.19
## 0.4.4
### Patch Changes
- Updated dependencies [a8d3fa6]
- @llamaindex/env@0.1.18
## 0.4.3
### Patch Changes
- 95a5cc6: refactor: move storage into core
## 0.4.2
### Patch Changes
- Updated dependencies [14cc9eb]
- @llamaindex/env@0.1.17
## 0.4.1
### Patch Changes
+2 -44
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/core",
"type": "module",
"version": "0.4.6",
"version": "0.4.1",
"description": "LlamaIndex Core Module",
"exports": {
"./agent": {
@@ -214,48 +214,6 @@
"default": "./storage/chat-store/dist/index.js"
}
},
"./storage/doc-store": {
"require": {
"types": "./storage/doc-store/dist/index.d.cts",
"default": "./storage/doc-store/dist/index.cjs"
},
"import": {
"types": "./storage/doc-store/dist/index.d.ts",
"default": "./storage/doc-store/dist/index.js"
},
"default": {
"types": "./storage/doc-store/dist/index.d.ts",
"default": "./storage/doc-store/dist/index.js"
}
},
"./storage/index-store": {
"require": {
"types": "./storage/index-store/dist/index.d.cts",
"default": "./storage/index-store/dist/index.cjs"
},
"import": {
"types": "./storage/index-store/dist/index.d.ts",
"default": "./storage/index-store/dist/index.js"
},
"default": {
"types": "./storage/index-store/dist/index.d.ts",
"default": "./storage/index-store/dist/index.js"
}
},
"./storage/kv-store": {
"require": {
"types": "./storage/kv-store/dist/index.d.cts",
"default": "./storage/kv-store/dist/index.cjs"
},
"import": {
"types": "./storage/kv-store/dist/index.d.ts",
"default": "./storage/kv-store/dist/index.js"
},
"default": {
"types": "./storage/kv-store/dist/index.d.ts",
"default": "./storage/kv-store/dist/index.js"
}
},
"./response-synthesizers": {
"require": {
"types": "./response-synthesizers/dist/index.d.cts",
@@ -392,7 +350,7 @@
"@edge-runtime/vm": "^4.0.3",
"ajv": "^8.17.1",
"bunchee": "5.6.1",
"happy-dom": "^15.11.0",
"happy-dom": "^15.10.0",
"natural": "^8.0.1"
},
"dependencies": {
+5 -32
View File
@@ -3,7 +3,7 @@ import {
BaseChatEngine,
type NonStreamingChatEngineParams,
type StreamingChatEngineParams,
} from "../chat-engine";
} from "../chat-engine/base";
import { wrapEventCaller } from "../decorator";
import { Settings } from "../global";
import type {
@@ -172,6 +172,7 @@ export abstract class AgentWorker<
start: async (controller) => {
for await (const stepOutput of taskOutputStream) {
this.#taskSet.add(stepOutput.taskStep);
controller.enqueue(stepOutput);
if (stepOutput.isLast) {
let currentStep: TaskStep<
AI,
@@ -182,30 +183,7 @@ export abstract class AgentWorker<
this.#taskSet.delete(currentStep);
currentStep = currentStep.prevStep;
}
const { output, taskStep } = stepOutput;
if (output instanceof ReadableStream) {
const [pipStream, finalStream] = output.tee();
stepOutput.output = finalStream;
const reader = pipStream.getReader();
const { value } = await reader.read();
reader.releaseLock();
let content: string = value!.delta;
for await (const chunk of pipStream) {
content += chunk.delta;
}
taskStep.context.store.messages = [
...taskStep.context.store.messages,
{
role: "assistant",
content,
options: value!.options,
},
];
}
controller.enqueue(stepOutput);
controller.close();
} else {
controller.enqueue(stepOutput);
}
}
},
@@ -395,15 +373,10 @@ export abstract class AgentRunner<
if (stepOutput.isLast) {
const { output } = stepOutput;
if (output instanceof ReadableStream) {
return output.pipeThrough(
new TransformStream<EngineResponse>({
return output.pipeThrough<EngineResponse>(
new TransformStream({
transform(chunk, controller) {
controller.enqueue(
EngineResponse.fromChatResponseChunk(
chunk,
chunk.sourceNodes,
),
);
controller.enqueue(EngineResponse.fromChatResponseChunk(chunk));
},
}),
);
+1 -1
View File
@@ -79,7 +79,7 @@ export async function stepToolsStreaming<Model extends LLM>({
for await (const chunk of pipStream) {
if (chunk.options && "toolCall" in chunk.options) {
const toolCall = chunk.options.toolCall;
toolCall.forEach((toolCall: ToolCall | PartialToolCall) => {
toolCall.forEach((toolCall) => {
toolCalls.set(toolCall.id, toolCall);
});
}
@@ -1,6 +1,5 @@
import { randomUUID } from "@llamaindex/env";
import type { UUID } from "../global";
import { BaseNode } from "../schema";
import { IndexStructType } from "./struct-type";
export abstract class IndexStruct {
@@ -66,48 +65,3 @@ export class KeywordTable extends IndexStruct {
};
}
}
export class IndexDict extends IndexStruct {
nodesDict: Record<string, BaseNode> = {};
type: IndexStructType = IndexStructType.SIMPLE_DICT;
addNode(node: BaseNode, textId?: string) {
const vectorId = textId ?? node.id_;
this.nodesDict[vectorId] = node;
}
toJson(): Record<string, unknown> {
const nodesDict: Record<string, unknown> = {};
for (const [key, node] of Object.entries(this.nodesDict)) {
nodesDict[key] = node.toJSON();
}
return {
...super.toJson(),
nodesDict,
type: this.type,
};
}
delete(nodeId: string) {
delete this.nodesDict[nodeId];
}
}
export class IndexList extends IndexStruct {
nodes: string[] = [];
type: IndexStructType = IndexStructType.LIST;
addNode(node: BaseNode) {
this.nodes.push(node.id_);
}
toJson(): Record<string, unknown> {
return {
...super.toJson(),
nodes: this.nodes,
type: this.type,
};
}
}
+1 -7
View File
@@ -1,8 +1,2 @@
export {
IndexDict,
IndexList,
IndexStruct,
KeywordTable,
} from "./data-structs";
export { jsonToIndexStruct } from "./json-to-index-struct";
export { IndexStruct, KeywordTable } from "./data-structs";
export { IndexStructType } from "./struct-type";
@@ -1,26 +0,0 @@
import type { BaseNode } from "../schema";
import { jsonToNode } from "../schema";
import { IndexDict, IndexList, IndexStruct } from "./data-structs";
import { IndexStructType } from "./struct-type";
export function jsonToIndexStruct(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
json: any,
): IndexStruct {
if (json.type === IndexStructType.LIST) {
const indexList = new IndexList(json.indexId, json.summary);
indexList.nodes = json.nodes;
return indexList;
} else if (json.type === IndexStructType.SIMPLE_DICT) {
const indexDict = new IndexDict(json.indexId, json.summary);
indexDict.nodesDict = Object.entries(json.nodesDict).reduce<
Record<string, BaseNode>
>((acc, [key, value]) => {
acc[key] = jsonToNode(value);
return acc;
}, {});
return indexDict;
} else {
throw new Error(`Unknown index struct type: ${json.type}`);
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
import type { Tokenizers } from "@llamaindex/env/tokenizers";
import { type Tokenizers } from "@llamaindex/env";
import type { MessageContentDetail } from "../llms";
import { BaseNode, MetadataMode, TransformComponent } from "../schema";
import { extractSingleText } from "../utils";
+1 -1
View File
@@ -1,4 +1,4 @@
import { Tokenizers, tokenizers } from "@llamaindex/env/tokenizers";
import { Tokenizers, tokenizers } from "@llamaindex/env";
export function truncateMaxTokens(
tokenizer: Tokenizers,
+1 -2
View File
@@ -1,5 +1,4 @@
import { getEnv } from "@llamaindex/env";
import type { Tokenizer } from "@llamaindex/env/tokenizers";
import { getEnv, type Tokenizer } from "@llamaindex/env";
import type { LLM } from "../llms";
import {
type CallbackManager,
@@ -1,5 +1,4 @@
import { AsyncLocalStorage } from "@llamaindex/env";
import { type Tokenizer, tokenizers } from "@llamaindex/env/tokenizers";
import { AsyncLocalStorage, type Tokenizer, tokenizers } from "@llamaindex/env";
const chunkSizeAsyncLocalStorage = new AsyncLocalStorage<Tokenizer>();
let globalTokenizer: Tokenizer = tokenizers.tokenizer();
+2 -2
View File
@@ -1,4 +1,4 @@
import type { Tokenizer } from "@llamaindex/env/tokenizers";
import { type Tokenizer, tokenizers } from "@llamaindex/env";
import {
DEFAULT_CHUNK_OVERLAP_RATIO,
DEFAULT_CONTEXT_WINDOW,
@@ -64,7 +64,7 @@ export class PromptHelper {
this.numOutput = numOutput;
this.chunkOverlapRatio = chunkOverlapRatio;
this.chunkSizeLimit = chunkSizeLimit;
this.tokenizer = tokenizer ?? Settings.tokenizer;
this.tokenizer = tokenizer ?? tokenizers.tokenizer();
this.separator = separator;
}
+2 -1
View File
@@ -1,4 +1,5 @@
import { extractText, streamConverter } from "../utils";
import { streamConverter } from "../utils";
import { extractText } from "../utils/llms";
import type {
ChatResponse,
ChatResponseChunk,
+2 -2
View File
@@ -1,6 +1,6 @@
import type { Tokenizers } from "@llamaindex/env/tokenizers";
import type { Tokenizers } from "@llamaindex/env";
import type { JSONSchemaType } from "ajv";
import type { JSONObject, JSONValue } from "../global";
import type { JSONObject, JSONValue } from "../global/type";
/**
* @internal
+1 -1
View File
@@ -1,4 +1,4 @@
import { type Tokenizer, tokenizers } from "@llamaindex/env/tokenizers";
import { type Tokenizer, tokenizers } from "@llamaindex/env";
import { Settings } from "../global";
import type { ChatMessage, LLM, MessageType } from "../llms";
import { defaultSummaryPrompt, type SummaryPrompt } from "../prompts";
@@ -1,4 +1,4 @@
import type { Tokenizer } from "@llamaindex/env/tokenizers";
import type { Tokenizer } from "@llamaindex/env";
import { z } from "zod";
import { Settings } from "../global";
import { sentenceSplitterSchema } from "../schema";
@@ -1,4 +1,4 @@
import type { Tokenizer } from "@llamaindex/env/tokenizers";
import type { Tokenizer } from "@llamaindex/env";
import { z } from "zod";
import { DEFAULT_CHUNK_OVERLAP, DEFAULT_CHUNK_SIZE, Settings } from "../global";
import { MetadataAwareTextSplitter } from "./base";
+1 -1
View File
@@ -1,4 +1,4 @@
import type { Tokenizer } from "@llamaindex/env/tokenizers";
import type { Tokenizer } from "@llamaindex/env";
export type SplitterParams = {
tokenizer?: Tokenizer;
+1 -1
View File
@@ -1,5 +1,6 @@
import type { MessageContent } from "../llms";
import type { BaseNodePostprocessor } from "../postprocessor";
import { BaseQueryEngine, type QueryType } from "../query-engine";
import {
type BaseSynthesizer,
getResponseSynthesizer,
@@ -7,7 +8,6 @@ import {
import { BaseRetriever } from "../retriever";
import type { NodeWithScore } from "../schema";
import { extractText } from "../utils";
import { BaseQueryEngine, type QueryType } from "./base";
export class RetrieverQueryEngine extends BaseQueryEngine {
retriever: BaseRetriever;
+1 -6
View File
@@ -1,10 +1,5 @@
export * from "./node";
export {
FileReader,
TransformComponent,
type BaseReader,
type StoredValue,
} from "./type";
export { FileReader, TransformComponent, type BaseReader } from "./type";
export type { BaseOutputParser } from "./type/base-output-parser";
export { EngineResponse } from "./type/engineresponse";
export * from "./zod";
-4
View File
@@ -1,10 +1,6 @@
import { fs, path, randomUUID } from "@llamaindex/env";
import type { BaseNode, Document } from "./node";
// fixme: remove any
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export type StoredValue = Record<string, any> | null;
interface TransformComponentSignature<
Result extends BaseNode[] | Promise<BaseNode[]>,
> {
@@ -1,167 +0,0 @@
import { path } from "@llamaindex/env";
import {
DEFAULT_DOC_STORE_PERSIST_FILENAME,
DEFAULT_PERSIST_DIR,
} from "../../global";
import type { StoredValue } from "../../schema";
import { BaseNode, Document, ObjectType, TextNode } from "../../schema";
const TYPE_KEY = "__type__";
const DATA_KEY = "__data__";
export interface Serializer<T> {
toPersistence(data: Record<string, unknown>): T;
fromPersistence(data: T): Record<string, unknown>;
}
export const jsonSerializer: Serializer<string> = {
toPersistence(data) {
return JSON.stringify(data);
},
fromPersistence(data) {
return JSON.parse(data);
},
};
export const noneSerializer: Serializer<Record<string, unknown>> = {
toPersistence(data) {
return data;
},
fromPersistence(data) {
return data;
},
};
type DocJson<Data> = {
[TYPE_KEY]: ObjectType;
[DATA_KEY]: Data;
};
export function isValidDocJson(
docJson: StoredValue | null | undefined,
): docJson is DocJson<unknown> {
return (
typeof docJson === "object" &&
docJson !== null &&
docJson[TYPE_KEY] !== undefined &&
docJson[DATA_KEY] !== undefined
);
}
export function docToJson(
doc: BaseNode,
serializer: Serializer<unknown>,
): DocJson<unknown> {
return {
[DATA_KEY]: serializer.toPersistence(doc.toJSON()),
[TYPE_KEY]: doc.type,
};
}
export function jsonToDoc<Data>(
docDict: DocJson<Data>,
serializer: Serializer<Data>,
): BaseNode {
const docType = docDict[TYPE_KEY];
// fixme: zod type check this
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const dataDict: any = serializer.fromPersistence(docDict[DATA_KEY]);
let doc: BaseNode;
if (docType === ObjectType.DOCUMENT) {
doc = new Document({
text: dataDict.text,
id_: dataDict.id_,
embedding: dataDict.embedding,
hash: dataDict.hash,
metadata: dataDict.metadata,
});
} else if (docType === ObjectType.TEXT) {
doc = new TextNode({
text: dataDict.text,
id_: dataDict.id_,
hash: dataDict.hash,
metadata: dataDict.metadata,
relationships: dataDict.relationships,
});
} else {
throw new Error(`Unknown doc type: ${docType}`);
}
return doc;
}
const DEFAULT_PERSIST_PATH = path.join(
DEFAULT_PERSIST_DIR,
DEFAULT_DOC_STORE_PERSIST_FILENAME,
);
export interface RefDocInfo {
nodeIds: string[];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
extraInfo: Record<string, any>;
}
export abstract class BaseDocumentStore {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
serializer: Serializer<any> = jsonSerializer;
// Save/load
persist(persistPath: string = DEFAULT_PERSIST_PATH): void {
// Persist the docstore to a file.
}
// Main interface
abstract docs(): Promise<Record<string, BaseNode>>;
abstract addDocuments(docs: BaseNode[], allowUpdate: boolean): Promise<void>;
abstract getDocument(
docId: string,
raiseError: boolean,
): Promise<BaseNode | undefined>;
abstract deleteDocument(docId: string, raiseError: boolean): Promise<void>;
abstract documentExists(docId: string): Promise<boolean>;
// Hash
abstract setDocumentHash(docId: string, docHash: string): Promise<void>;
abstract getDocumentHash(docId: string): Promise<string | undefined>;
abstract getAllDocumentHashes(): Promise<Record<string, string>>;
// Ref Docs
abstract getAllRefDocInfo(): Promise<Record<string, RefDocInfo> | undefined>;
abstract getRefDocInfo(refDocId: string): Promise<RefDocInfo | undefined>;
abstract deleteRefDoc(refDocId: string, raiseError: boolean): Promise<void>;
// Nodes
getNodes(nodeIds: string[], raiseError: boolean = true): Promise<BaseNode[]> {
return Promise.all(
nodeIds.map((nodeId) => this.getNode(nodeId, raiseError)),
);
}
async getNode(nodeId: string, raiseError: boolean = true): Promise<BaseNode> {
const doc = await this.getDocument(nodeId, raiseError);
if (!(doc instanceof BaseNode)) {
throw new Error(`Document ${nodeId} is not a Node.`);
}
return doc;
}
async getNodeDict(nodeIdDict: {
[index: number]: string;
}): Promise<Record<number, BaseNode>> {
const result: Record<number, BaseNode> = {};
for (const index in nodeIdDict) {
result[index] = await this.getNode(nodeIdDict[index]!);
}
return result;
}
}
@@ -1,115 +0,0 @@
import { path } from "@llamaindex/env";
import { IndexStruct, jsonToIndexStruct } from "../../data-structs";
import {
DEFAULT_INDEX_STORE_PERSIST_FILENAME,
DEFAULT_NAMESPACE,
DEFAULT_PERSIST_DIR,
} from "../../global";
import {
BaseInMemoryKVStore,
BaseKVStore,
type DataType,
SimpleKVStore,
} from "../kv-store";
export const DEFAULT_PERSIST_PATH = path.join(
DEFAULT_PERSIST_DIR,
DEFAULT_INDEX_STORE_PERSIST_FILENAME,
);
export abstract class BaseIndexStore {
abstract getIndexStructs(): Promise<IndexStruct[]>;
abstract addIndexStruct(indexStruct: IndexStruct): Promise<void>;
abstract deleteIndexStruct(key: string): Promise<void>;
abstract getIndexStruct(structId?: string): Promise<IndexStruct | undefined>;
async persist(persistPath: string = DEFAULT_PERSIST_PATH): Promise<void> {
// Persist the index store to disk.
}
}
export class KVIndexStore extends BaseIndexStore {
private _kvStore: BaseKVStore;
private _collection: string;
constructor(kvStore: BaseKVStore, namespace: string = DEFAULT_NAMESPACE) {
super();
this._kvStore = kvStore;
this._collection = `${namespace}/data`;
}
async addIndexStruct(indexStruct: IndexStruct): Promise<void> {
const key = indexStruct.indexId;
const data = indexStruct.toJson();
await this._kvStore.put(key, data, this._collection);
}
async deleteIndexStruct(key: string): Promise<void> {
await this._kvStore.delete(key, this._collection);
}
async getIndexStruct(structId?: string): Promise<IndexStruct | undefined> {
if (!structId) {
const structs = await this.getIndexStructs();
if (structs.length !== 1) {
throw new Error("More than one index struct found");
}
return structs[0];
} else {
const json = await this._kvStore.get(structId, this._collection);
if (json == null) {
return;
}
return jsonToIndexStruct(json);
}
}
async getIndexStructs(): Promise<IndexStruct[]> {
const jsons = await this._kvStore.getAll(this._collection);
return Object.values(jsons).map((json) => jsonToIndexStruct(json));
}
}
export class SimpleIndexStore extends KVIndexStore {
private kvStore: BaseInMemoryKVStore;
constructor(kvStore?: BaseInMemoryKVStore) {
kvStore = kvStore || new SimpleKVStore();
super(kvStore);
this.kvStore = kvStore;
}
static async fromPersistDir(
persistDir: string = DEFAULT_PERSIST_DIR,
): Promise<SimpleIndexStore> {
const persistPath = path.join(
persistDir,
DEFAULT_INDEX_STORE_PERSIST_FILENAME,
);
return this.fromPersistPath(persistPath);
}
static async fromPersistPath(persistPath: string): Promise<SimpleIndexStore> {
const simpleKVStore = await SimpleKVStore.fromPersistPath(persistPath);
return new SimpleIndexStore(simpleKVStore);
}
async persist(persistPath: string = DEFAULT_PERSIST_DIR): Promise<void> {
this.kvStore.persist(persistPath);
}
static fromDict(saveDict: DataType): SimpleIndexStore {
const simpleKVStore = SimpleKVStore.fromDict(saveDict);
return new SimpleIndexStore(simpleKVStore);
}
toDict(): Record<string, unknown> {
if (!(this.kvStore instanceof SimpleKVStore)) {
throw new Error("KVStore is not a SimpleKVStore");
}
return this.kvStore.toDict();
}
}
@@ -1,8 +0,0 @@
{
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": "./dist/index.js",
"private": true
}
@@ -1,8 +0,0 @@
{
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": "./dist/index.js",
"private": true
}
@@ -1,8 +0,0 @@
{
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": "./dist/index.js",
"private": true
}
+1 -1
View File
@@ -1,5 +1,5 @@
import { truncateMaxTokens } from "@llamaindex/core/embeddings";
import { Tokenizers, tokenizers } from "@llamaindex/env/tokenizers";
import { Tokenizers, tokenizers } from "@llamaindex/env";
import { describe, expect, test } from "vitest";
describe("truncateMaxTokens", () => {
@@ -1,6 +1,6 @@
import { SentenceSplitter } from "@llamaindex/core/node-parser";
import { Document } from "@llamaindex/core/schema";
import { tokenizers } from "@llamaindex/env/tokenizers";
import { tokenizers } from "@llamaindex/env";
import { beforeEach, describe, expect, test } from "vitest";
describe("SentenceSplitter", () => {
+1
View File
@@ -8,6 +8,7 @@
"moduleResolution": "Bundler",
"skipLibCheck": true,
"strict": true,
"lib": ["ESNext", "DOM", "DOM.AsyncIterable"],
"types": ["node"]
},
"include": ["./src"],
-27
View File
@@ -1,32 +1,5 @@
# @llamaindex/env
## 0.1.20
### Patch Changes
- 4fc001c: chore: bump `@huggingface/transformers`
Upgrade to v3, please read https://github.com/huggingface/transformers.js/releases/tag/3.0.0 for more information.
## 0.1.19
### Patch Changes
- ad85bd0: - fix agent chat message not saved into the task context when streaming
- fix async local storage might use `node:async_hook` in edge-light/workerd condition
## 0.1.18
### Patch Changes
- a8d3fa6: fix: exports in package.json
## 0.1.17
### Patch Changes
- 14cc9eb: chore: move multi-model into single sub module
## 0.1.16
### Patch Changes
-12
View File
@@ -1,12 +0,0 @@
{
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"exports": {
"browser": "./dist/index.browser.js",
"edge-light": "./dist/index.edge-light.js",
"workerd": "./dist/index.workerd.js"
},
"private": true
}
+5 -59
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/env",
"description": "environment wrapper, supports all JS environment including node, deno, bun, edge runtime, and cloudflare worker",
"version": "0.1.20",
"version": "0.1.16",
"type": "module",
"types": "dist/index.d.ts",
"module": "dist/index.js",
@@ -28,7 +28,7 @@
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"require": "./dist/index.cjs",
"default": "./dist/index.js"
"default": "./dist/index.cjs"
},
"workerd": {
"types": "./dist/index.workerd.d.ts",
@@ -50,63 +50,9 @@
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
},
"./tokenizers": {
"workerd": {
"types": "./tokenizers/dist/index.workerd.d.ts",
"default": "./tokenizers/dist/index.workerd.js"
},
"edge-light": {
"types": "./tokenizers/dist/index.edge-light.d.ts",
"default": "./tokenizers/dist/index.edge-light.js"
},
"browser": {
"types": "./tokenizers/dist/index.browser.d.ts",
"default": "./tokenizers/dist/index.browser.js"
},
"import": {
"types": "./tokenizers/dist/index.d.ts",
"default": "./tokenizers/dist/index.js"
},
"require": {
"types": "./tokenizers/dist/index.d.cts",
"default": "./tokenizers/dist/index.cjs"
},
"default": {
"types": "./tokenizers/dist/index.d.ts",
"default": "./tokenizers/dist/index.js"
}
},
"./multi-model": {
"workerd": {
"types": "./multi-model/dist/index.workerd.d.ts",
"default": "./multi-model/dist/index.workerd.js"
},
"edge-light": {
"types": "./multi-model/dist/index.edge-light.d.ts",
"default": "./multi-model/dist/index.edge-light.js"
},
"browser": {
"types": "./multi-model/dist/index.browser.d.ts",
"default": "./multi-model/dist/index.browser.js"
},
"import": {
"types": "./multi-model/dist/index.d.ts",
"default": "./multi-model/dist/index.js"
},
"require": {
"types": "./multi-model/dist/index.d.cts",
"default": "./multi-model/dist/index.cjs"
},
"default": {
"types": "./multi-model/dist/index.d.ts",
"default": "./multi-model/dist/index.js"
}
}
},
"files": [
"tokenizers",
"multi-model",
"dist",
"CHANGELOG.md",
"!**/*.tsbuildinfo"
@@ -124,7 +70,7 @@
"devDependencies": {
"@types/node": "^22.9.0",
"@types/readable-stream": "^4.0.15",
"@huggingface/transformers": "^3.0.2",
"@xenova/transformers": "^2.17.2",
"bunchee": "5.6.1",
"gpt-tokenizer": "^2.6.0",
"pathe": "^1.1.2",
@@ -132,7 +78,7 @@
},
"peerDependencies": {
"@aws-crypto/sha256-js": "^5.2.0",
"@huggingface/transformers": "^3.0.2",
"@xenova/transformers": "^2.17.2",
"gpt-tokenizer": "^2.5.0",
"js-tiktoken": "^1.0.12",
"pathe": "^1.1.2"
@@ -141,7 +87,7 @@
"@aws-crypto/sha256-js": {
"optional": true
},
"@huggingface/transformers": {
"@xenova/transformers": {
"optional": true
},
"pathe": {
-1
View File
@@ -1 +0,0 @@
export { AsyncLocalStorage } from "node:async_hooks";
-3
View File
@@ -1,3 +0,0 @@
// Async Local Storage is available cross different JS runtimes
// @ts-expect-error AsyncLocalStorage is not defined in Non Node.js environment
export const AsyncLocalStorage = globalThis.AsyncLocalStorage;
-32
View File
@@ -1,32 +0,0 @@
// Web doesn't have AsyncLocalStorage and there's no alternative way to implement it
// Wait for https://github.com/tc39/proposal-async-context
export class AsyncLocalStorage<T> {
#store: T = null!;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
static bind<Func extends (...args: any[]) => any>(fn: Func): Func {
return fn;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
static snapshot(): <R, TArgs extends any[]>(
fn: (...args: TArgs) => R,
...args: TArgs
) => R {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return (cb: any, ...args: any[]) => cb(...args);
}
getStore() {
return this.#store;
}
run<R>(store: T, cb: () => R): R {
this.#store = store;
if (cb.constructor.name === "AsyncFunction") {
console.warn("AsyncLocalStorage is not supported in the web environment");
console.warn("Please note that some features may not work as expected");
}
return cb();
}
}
+8 -1
View File
@@ -5,10 +5,17 @@
*/
import "./global-check.js";
export * from "./als/index.web.js";
export { consoleLogger, emptyLogger, type Logger } from "./logger/index.js";
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./multi-model/index.browser.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js";
export { NotSupportCurrentRuntimeClass } from "./utils/shared.js";
export * from "./web-polyfill.js";
// @ts-expect-error no type
if (typeof window === "undefined") {
console.warn(
"You are not in a browser environment. This module is not supposed to be used in a non-browser environment.",
+8 -2
View File
@@ -3,8 +3,14 @@
*
* @module
*/
export * from "./als/index.non-node.js";
import "./global-check.js";
export { consoleLogger, emptyLogger, type Logger } from "./logger/index.js";
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./multi-model/index.non-nodejs.js";
export * from "./node-polyfill.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js";
export { NotSupportCurrentRuntimeClass } from "./utils/shared.js";
+13 -2
View File
@@ -34,9 +34,20 @@ export function createSHA256(): SHA256 {
};
}
export * from "./als/index.node.js";
export { consoleLogger, emptyLogger, type Logger } from "./logger/index.js";
export { CustomEvent, getEnv, setEnvs } from "./utils/index.js";
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./multi-model/index.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/node.js";
export {
AsyncLocalStorage,
CustomEvent,
getEnv,
setEnvs,
} from "./utils/index.js";
export { NotSupportCurrentRuntimeClass } from "./utils/shared.js";
export {
EOL,
+7 -1
View File
@@ -7,7 +7,6 @@
*/
import { INTERNAL_ENV } from "./utils/index.js";
export * from "./als/index.non-node.js";
export { NotSupportCurrentRuntimeClass } from "./utils/shared.js";
export * from "./node-polyfill.js";
@@ -17,3 +16,10 @@ export function getEnv(name: string): string | undefined {
}
export { consoleLogger, emptyLogger, type Logger } from "./logger/index.js";
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./multi-model/index.non-nodejs.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js";
-17
View File
@@ -1,17 +0,0 @@
let transformer: typeof import("@huggingface/transformers") | null = null;
export function getTransformers() {
return transformer;
}
export function setTransformers(t: typeof import("@huggingface/transformers")) {
transformer = t;
}
export type OnLoad = (
transformer: typeof import("@huggingface/transformers"),
) => void;
export type LoadTransformerEvent = {
transformer: typeof import("@huggingface/transformers");
};
-6
View File
@@ -1,6 +0,0 @@
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./internal/multi-model/browser.js";
-6
View File
@@ -1,6 +0,0 @@
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./internal/multi-model/non-node.js";
-6
View File
@@ -1,6 +0,0 @@
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./internal/multi-model/node.js";
-6
View File
@@ -1,6 +0,0 @@
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./internal/multi-model/non-node.js";
@@ -8,10 +8,8 @@ export {
export async function loadTransformers(onLoad: OnLoad) {
if (getTransformers() === null) {
setTransformers(
await import(
// @ts-expect-error no type
"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.0.2"
),
// @ts-expect-error no type
await import("https://cdn.jsdelivr.net/npm/@xenova/transformers@2.17.2"),
);
} else {
return getTransformers()!;
@@ -9,7 +9,7 @@ export async function loadTransformers(onLoad: OnLoad) {
if (getTransformers() === null) {
/**
* If you see this warning, it means that the current environment does not support the transformer.
* because "@huggingface/transformers" highly depends on Node.js APIs.
* because "@xeonva/transformers" highly depends on Node.js APIs.
*
* One possible solution is to fix their implementation to make it work in the non-Node.js environment,
* but it's not worth the effort because Edge Runtime and Cloudflare Workers are not the for heavy Machine Learning task.
@@ -17,14 +17,14 @@ export async function loadTransformers(onLoad: OnLoad) {
* Or you can provide an RPC server that runs the transformer in a Node.js environment.
* Or you just run the code in a Node.js environment.
*
* Refs: https://github.com/huggingface/transformers.js/issues/309
* Refs: https://github.com/xenova/transformers.js/issues/309
*/
console.warn(
'"@huggingface/transformers" is not officially supported in this environment, some features may not work as expected.',
'"@xenova/transformers" is not officially supported in this environment, some features may not work as expected.',
);
setTransformers(
// @ts-expect-error no type
await import("@huggingface/transformers/dist/transformers.js"),
await import("@xenova/transformers/dist/transformers"),
);
} else {
return getTransformers()!;
@@ -8,7 +8,7 @@ export {
export async function loadTransformers(onLoad: OnLoad) {
if (getTransformers() === null) {
setTransformers(await import("@huggingface/transformers"));
setTransformers(await import("@xenova/transformers"));
} else {
return getTransformers()!;
}
+17
View File
@@ -0,0 +1,17 @@
let transformer: typeof import("@xenova/transformers") | null = null;
export function getTransformers() {
return transformer;
}
export function setTransformers(t: typeof import("@xenova/transformers")) {
transformer = t;
}
export type OnLoad = (
transformer: typeof import("@xenova/transformers"),
) => void;
export type LoadTransformerEvent = {
transformer: typeof import("@xenova/transformers");
};
+6 -1
View File
@@ -56,4 +56,9 @@ export const process: NodeJS.Process = globalThis.process ?? {
versions: {},
};
export { CustomEvent, getEnv, setEnvs } from "./utils/index.js";
export {
AsyncLocalStorage,
CustomEvent,
getEnv,
setEnvs,
} from "./utils/index.js";
-5
View File
@@ -1,5 +0,0 @@
export {
Tokenizers,
tokenizers,
type Tokenizer,
} from "./internal/tokenizers/js.js";
-5
View File
@@ -1,5 +0,0 @@
export {
Tokenizers,
tokenizers,
type Tokenizer,
} from "./internal/tokenizers/js.js";
-5
View File
@@ -1,5 +0,0 @@
export {
Tokenizers,
tokenizers,
type Tokenizer,
} from "./internal/tokenizers/node.js";
-5
View File
@@ -1,5 +0,0 @@
export {
Tokenizers,
tokenizers,
type Tokenizer,
} from "./internal/tokenizers/js.js";
@@ -1,4 +1,4 @@
// Note: js-tiktoken it's 60x slower than gpt-tokenizer
// Note: js-tiktoken it's 60x slower than the WASM implementation - use it only for unsupported environments
import { getEncoding } from "js-tiktoken";
import type { Tokenizer } from "./types.js";
import { Tokenizers } from "./types.js";
@@ -1,3 +1,4 @@
// Note: This is using th WASM implementation of tiktoken which is 60x faster
import type { Tokenizer } from "./types.js";
import { Tokenizers } from "./types.js";
+3
View File
@@ -56,6 +56,9 @@ interface CustomEventInit<T = any> extends EventInit {
detail?: T;
}
// Async Local Storage is available cross different JS runtimes
export { AsyncLocalStorage } from "node:async_hooks";
// Node.js 18 doesn't have CustomEvent by default
// Refs: https://github.com/nodejs/node/issues/40678
// eslint-disable-next-line @typescript-eslint/no-explicit-any
+32
View File
@@ -13,6 +13,38 @@ export function getEnv(name: string): string | undefined {
}
}
// Web doesn't have AsyncLocalStorage and there's no alternative way to implement it
// Wait for https://github.com/tc39/proposal-async-context
export class AsyncLocalStorage<T> {
#store: T = null!;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
static bind<Func extends (...args: any[]) => any>(fn: Func): Func {
return fn;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
static snapshot(): <R, TArgs extends any[]>(
fn: (...args: TArgs) => R,
...args: TArgs
) => R {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return (cb: any, ...args: any[]) => cb(...args);
}
getStore() {
return this.#store;
}
run<R>(store: T, cb: () => R): R {
this.#store = store;
if (cb.constructor.name === "AsyncFunction") {
console.warn("AsyncLocalStorage is not supported in the web environment");
console.warn("Please note that some features may not work as expected");
}
return cb();
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const defaultCustomEvent = (globalThis as any).CustomEvent;
+4 -2
View File
@@ -18,8 +18,10 @@ export class NotSupportCurrentRuntimeClass {
export const glo: any =
typeof globalThis !== "undefined"
? globalThis
: typeof window !== "undefined"
? window
: // @ts-expect-error globalThis is not defined
typeof window !== "undefined"
? // @ts-expect-error window is not defined
window
: typeof global !== "undefined"
? global
: {};
+7 -1
View File
@@ -49,4 +49,10 @@ export function randomUUID(): string {
return crypto.randomUUID();
}
export { CustomEvent, getEnv, process, setEnvs } from "./utils/index.web.js";
export {
AsyncLocalStorage,
CustomEvent,
getEnv,
process,
setEnvs,
} from "./utils/index.web.js";
+3 -13
View File
@@ -1,21 +1,11 @@
import { describe, expect, it } from "vitest";
import { tokenizers as fallbackTokenizers } from "../src/internal/tokenizers/js.js";
import { tokenizers as nodeTokenizers } from "../src/internal/tokenizers/node.js";
import { tokenizers } from "../src/tokenizers/node.js";
describe("node tokenizer", () => {
describe("tokenizer", () => {
it("should tokenize text", () => {
const tokenizer = nodeTokenizers.tokenizer();
const tokenizer = tokenizers.tokenizer();
expect(tokenizer.decode(tokenizer.encode("hello world"))).toBe(
"hello world",
);
});
it("should have same result as fallback tokenizer", () => {
const nodeTokenizer = nodeTokenizers.tokenizer();
const fallbackTokenizer = fallbackTokenizers.tokenizer();
const text = "hello world";
expect(nodeTokenizer.decode(nodeTokenizer.encode(text))).toBe(
fallbackTokenizer.decode(fallbackTokenizer.encode(text)),
);
});
});
-8
View File
@@ -1,8 +0,0 @@
{
"extends": ["//"],
"tasks": {
"build": {
"outputs": ["**/dist/**"]
}
}
}

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