Compare commits

...

10 Commits

Author SHA1 Message Date
github-actions[bot] bdc4bfe7b0 Release 0.6.6 (#1241)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-09-23 11:54:33 -07:00
Goran 025ffe6b50 fix: update PostgresKVStore constructor params (#1240)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-09-23 10:46:11 -07:00
Cahid Arda Öz a6595747fa feat: add Upstash Vector Store (#1218)
Co-authored-by: ogzhanolguncu <ogzhan11@gmail.com>
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-09-23 10:00:10 -07:00
Marcus Schiesser d902cc3e7e fix: context not working in contextchatengine (#1237) 2024-09-22 15:19:13 -07:00
github-actions[bot] 726eb41359 Release 0.6.5 (#1239)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-09-20 14:24:23 -07:00
André Mazayev e9714dbfcd feat: update PGVectorStore constructor parameters (#1225)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-09-20 01:34:51 -07:00
Alex Yang a3618e761e chore: fix cache for cloud package (#1236) 2024-09-19 17:48:39 -07:00
github-actions[bot] 24eabe7f35 Release 0.6.4 (#1234)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-09-19 16:42:39 -07:00
Alex Yang ecfa939ea6 ci: enable remote cache (#1233) 2024-09-19 15:40:34 -07:00
Alex Yang b48bcc3add feat: support custom @xenova/transformers (#1232) 2024-09-19 14:55:23 -07:00
70 changed files with 1256 additions and 367 deletions
+3
View File
@@ -14,6 +14,9 @@ concurrency:
env:
POSTGRES_HOST_AUTH_METHOD: trust
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
TURBO_REMOTE_ONLY: true
jobs:
e2e:
+23
View File
@@ -1,5 +1,28 @@
# docs
## 0.0.75
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
## 0.0.74
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.73
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
## 0.0.72
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "docs",
"version": "0.0.72",
"version": "0.0.75",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
+5 -1
View File
@@ -40,7 +40,11 @@ async function main(args: any) {
const rdr = new SimpleDirectoryReader(callback);
const docs = await rdr.loadData({ directoryPath: sourceDir });
const pgvs = new PGVectorStore();
const pgvs = new PGVectorStore({
clientConfig: {
connectionString: process.env.PG_CONNECTION_STRING,
},
});
pgvs.setCollection(sourceDir);
await pgvs.clearCollection();
+5 -1
View File
@@ -7,7 +7,11 @@ async function main() {
});
try {
const pgvs = new PGVectorStore();
const pgvs = new PGVectorStore({
clientConfig: {
connectionString: process.env.PG_CONNECTION_STRING,
},
});
// Optional - set your collection name, default is no filter on this field.
// pgvs.setCollection();
+23
View File
@@ -1,5 +1,28 @@
# @llamaindex/autotool
## 3.0.6
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
## 3.0.5
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 3.0.4
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
## 3.0.3
### Patch Changes
@@ -1,5 +1,31 @@
# @llamaindex/autotool-01-node-example
## 0.0.15
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
- @llamaindex/autotool@3.0.6
## 0.0.14
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
- @llamaindex/autotool@3.0.5
## 0.0.13
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
- @llamaindex/autotool@3.0.4
## 0.0.12
### Patch Changes
@@ -13,5 +13,5 @@
"scripts": {
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
},
"version": "0.0.12"
"version": "0.0.15"
}
@@ -1,5 +1,31 @@
# @llamaindex/autotool-02-next-example
## 0.1.59
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
- @llamaindex/autotool@3.0.6
## 0.1.58
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
- @llamaindex/autotool@3.0.5
## 0.1.57
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
- @llamaindex/autotool@3.0.4
## 0.1.56
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/autotool-02-next-example",
"private": true,
"version": "0.1.56",
"version": "0.1.59",
"scripts": {
"dev": "next dev",
"build": "next build",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/autotool",
"type": "module",
"version": "3.0.3",
"version": "3.0.6",
"description": "auto transpile your JS function to LLM Agent compatible",
"files": [
"dist",
+8
View File
@@ -0,0 +1,8 @@
{
"extends": ["//"],
"tasks": {
"build": {
"outputs": ["dist/**", "src/client/**"]
}
}
}
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/community
## 0.0.39
### Patch Changes
- Updated dependencies [d902cc3]
- @llamaindex/core@0.2.5
## 0.0.38
### Patch Changes
- Updated dependencies [b48bcc3]
- @llamaindex/core@0.2.4
- @llamaindex/env@0.1.12
## 0.0.37
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/community",
"description": "Community package for LlamaIndexTS",
"version": "0.0.37",
"version": "0.0.39",
"type": "module",
"types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js",
+17
View File
@@ -1,5 +1,22 @@
# @llamaindex/core
## 0.2.5
### Patch Changes
- d902cc3: Fix context not being sent using ContextChatEngine
## 0.2.4
### Patch Changes
- b48bcc3: feat: add `load-transformers` event type when loading `@xenova/transformers` module
This would benefit user who want to customize the transformer env.
- Updated dependencies [b48bcc3]
- @llamaindex/env@0.1.12
## 0.2.3
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/core",
"type": "module",
"version": "0.2.3",
"version": "0.2.5",
"description": "LlamaIndex Core Module",
"exports": {
"./node-parser": {
@@ -128,16 +128,29 @@ export class CallbackManager {
dispatchEvent<K extends keyof LlamaIndexEventMaps>(
event: K,
detail: LlamaIndexEventMaps[K],
sync = false,
) {
const cbs = this.#handlers.get(event);
if (!cbs) {
return;
}
queueMicrotask(() => {
if (typeof queueMicrotask === "undefined") {
console.warn(
"queueMicrotask is not available, dispatching synchronously",
);
sync = true;
}
if (sync) {
cbs.forEach((handler) =>
handler(LlamaIndexCustomEvent.fromEvent(event, { ...detail })),
);
});
} else {
queueMicrotask(() => {
cbs.forEach((handler) =>
handler(LlamaIndexCustomEvent.fromEvent(event, { ...detail })),
);
});
}
}
}
+23 -2
View File
@@ -1,5 +1,5 @@
import { Settings } from "../global";
import type { ChatMessage, MessageContent } from "../llms";
import type { ChatMessage } from "../llms";
import { type BaseChatStore, SimpleChatStore } from "../storage/chat-store";
import { extractText } from "../utils";
@@ -12,15 +12,36 @@ export const DEFAULT_CHAT_STORE_KEY = "chat_history";
export abstract class BaseMemory<
AdditionalMessageOptions extends object = object,
> {
/**
* Retrieves messages from the memory, optionally including transient messages.
* Compared to getAllMessages, this method a) allows for transient messages to be included in the retrieval and b) may return a subset of the total messages by applying a token limit.
* @param transientMessages Optional array of temporary messages to be included in the retrieval.
* These messages are not stored in the memory but are considered for the current interaction.
* @returns An array of chat messages, either synchronously or as a Promise.
*/
abstract getMessages(
input?: MessageContent | undefined,
transientMessages?: ChatMessage<AdditionalMessageOptions>[] | undefined,
):
| ChatMessage<AdditionalMessageOptions>[]
| Promise<ChatMessage<AdditionalMessageOptions>[]>;
/**
* Retrieves all messages stored in the memory.
* @returns An array of all chat messages, either synchronously or as a Promise.
*/
abstract getAllMessages():
| ChatMessage<AdditionalMessageOptions>[]
| Promise<ChatMessage<AdditionalMessageOptions>[]>;
/**
* Adds a new message to the memory.
* @param messages The chat message to be added to the memory.
*/
abstract put(messages: ChatMessage<AdditionalMessageOptions>): void;
/**
* Clears all messages from the memory.
*/
abstract reset(): void;
protected _tokenCountForMessages(messages: ChatMessage[]): number {
+14 -8
View File
@@ -1,5 +1,5 @@
import { Settings } from "../global";
import type { ChatMessage, LLM, MessageContent } from "../llms";
import type { ChatMessage, LLM } from "../llms";
import { type BaseChatStore } from "../storage/chat-store";
import { BaseChatStoreMemory, DEFAULT_TOKEN_LIMIT_RATIO } from "./base";
@@ -34,7 +34,7 @@ export class ChatMemoryBuffer<
}
getMessages(
input?: MessageContent | undefined,
transientMessages?: ChatMessage<AdditionalMessageOptions>[] | undefined,
initialTokenCount: number = 0,
) {
const messages = this.getAllMessages();
@@ -43,16 +43,22 @@ export class ChatMemoryBuffer<
throw new Error("Initial token count exceeds token limit");
}
let messageCount = messages.length;
let currentMessages = messages.slice(-messageCount);
let tokenCount = this._tokenCountForMessages(messages) + initialTokenCount;
// Add input messages as transient messages
const messagesWithInput = transientMessages
? [...transientMessages, ...messages]
: messages;
let messageCount = messagesWithInput.length;
let currentMessages = messagesWithInput.slice(-messageCount);
let tokenCount =
this._tokenCountForMessages(messagesWithInput) + initialTokenCount;
while (tokenCount > this.tokenLimit && messageCount > 1) {
messageCount -= 1;
if (messages.at(-messageCount)!.role === "assistant") {
if (messagesWithInput.at(-messageCount)!.role === "assistant") {
messageCount -= 1;
}
currentMessages = messages.slice(-messageCount);
currentMessages = messagesWithInput.slice(-messageCount);
tokenCount =
this._tokenCountForMessages(currentMessages) + initialTokenCount;
}
@@ -60,6 +66,6 @@ export class ChatMemoryBuffer<
if (tokenCount > this.tokenLimit && messageCount <= 0) {
return [];
}
return messages.slice(-messageCount);
return messagesWithInput.slice(-messageCount);
}
}
+10 -6
View File
@@ -114,18 +114,22 @@ export class ChatSummaryMemoryBuffer extends BaseMemory {
}
}
private calcCurrentRequestMessages() {
// TODO: check order: currently, we're sending:
private calcCurrentRequestMessages(transientMessages?: ChatMessage[]) {
// currently, we're sending:
// system messages first, then transient messages and then the messages that describe the conversation so far
return [...this.systemMessages, ...this.calcConversationMessages(true)];
return [
...this.systemMessages,
...(transientMessages ? transientMessages : []),
...this.calcConversationMessages(true),
];
}
reset() {
this.messages = [];
}
async getMessages(): Promise<ChatMessage[]> {
const requestMessages = this.calcCurrentRequestMessages();
async getMessages(transientMessages?: ChatMessage[]): Promise<ChatMessage[]> {
const requestMessages = this.calcCurrentRequestMessages(transientMessages);
// get tokens of current request messages and the transient messages
const tokens = requestMessages.reduce(
@@ -149,7 +153,7 @@ export class ChatSummaryMemoryBuffer extends BaseMemory {
// TODO: we still might have too many tokens
// e.g. too large system messages or transient messages
// how should we deal with that?
return this.calcCurrentRequestMessages();
return this.calcCurrentRequestMessages(transientMessages);
}
return requestMessages;
}
@@ -0,0 +1,74 @@
import { Settings } from "@llamaindex/core/global";
import type { ChatMessage } from "@llamaindex/core/llms";
import { ChatMemoryBuffer } from "@llamaindex/core/memory";
import { beforeEach, describe, expect, test } from "vitest";
describe("ChatMemoryBuffer", () => {
beforeEach(() => {
// Mock the Settings.llm
(Settings.llm as any) = {
metadata: {
contextWindow: 1000,
},
};
});
test("constructor initializes with custom token limit", () => {
const buffer = new ChatMemoryBuffer({ tokenLimit: 500 });
expect(buffer.tokenLimit).toBe(500);
});
test("getMessages returns all messages when under token limit", () => {
const messages: ChatMessage[] = [
{ role: "user", content: "Hello" },
{ role: "assistant", content: "Hi there!" },
{ role: "user", content: "How are you?" },
];
const buffer = new ChatMemoryBuffer({
tokenLimit: 1000,
chatHistory: messages,
});
const result = buffer.getMessages();
expect(result).toEqual(messages);
});
test("getMessages truncates messages when over token limit", () => {
const messages: ChatMessage[] = [
{ role: "user", content: "This is a long message" },
{ role: "assistant", content: "This is also a long reply" },
{ role: "user", content: "Short" },
];
const buffer = new ChatMemoryBuffer({
tokenLimit: 5, // limit to only allow the last message
chatHistory: messages,
});
const result = buffer.getMessages();
expect(result).toEqual([{ role: "user", content: "Short" }]);
});
test("getMessages handles input messages", () => {
const storedMessages: ChatMessage[] = [
{ role: "user", content: "Hello" },
{ role: "assistant", content: "Hi there!" },
];
const buffer = new ChatMemoryBuffer({
tokenLimit: 50,
chatHistory: storedMessages,
});
const inputMessages: ChatMessage[] = [
{ role: "user", content: "New message" },
];
const result = buffer.getMessages(inputMessages);
expect(result).toEqual([...inputMessages, ...storedMessages]);
});
test("getMessages throws error when initial token count exceeds limit", () => {
const buffer = new ChatMemoryBuffer({ tokenLimit: 10 });
expect(() => buffer.getMessages(undefined, 20)).toThrow(
"Initial token count exceeds token limit",
);
});
});
+8
View File
@@ -1,5 +1,13 @@
# @llamaindex/env
## 0.1.12
### Patch Changes
- b48bcc3: feat: add `load-transformers` event type when loading `@xenova/transformers` module
This would benefit user who want to customize the transformer env.
## 0.1.11
### Patch Changes
+13 -2
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.11",
"version": "0.1.12",
"type": "module",
"types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js",
@@ -74,16 +74,18 @@
"@aws-crypto/sha256-js": "^5.2.0",
"@swc/cli": "^0.4.0",
"@swc/core": "^1.7.22",
"@xenova/transformers": "^2.17.2",
"concurrently": "^8.2.2",
"pathe": "^1.1.2",
"tiktoken": "^1.0.16",
"vitest": "^2.0.5"
},
"dependencies": {
"@types/lodash": "^4.17.7",
"@types/node": "^22.5.1"
},
"peerDependencies": {
"@aws-crypto/sha256-js": "^5.2.0",
"@xenova/transformers": "^2.17.2",
"js-tiktoken": "^1.0.12",
"pathe": "^1.1.2",
"tiktoken": "^1.0.15"
@@ -92,8 +94,17 @@
"@aws-crypto/sha256-js": {
"optional": true
},
"@xenova/transformers": {
"optional": true
},
"pathe": {
"optional": true
},
"tiktoken": {
"optional": true
},
"js-tiktoken": {
"optional": true
}
}
}
+6
View File
@@ -6,6 +6,12 @@
import "./global-check.js";
export * from "./web-polyfill.js";
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./multi-model/index.browser.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js";
// @ts-expect-error
+6
View File
@@ -6,4 +6,10 @@
import "./global-check.js";
export * from "./node-polyfill.js";
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./multi-model/index.non-nodejs.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js";
+6
View File
@@ -33,6 +33,12 @@ export function createSHA256(): SHA256 {
};
}
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./multi-model/index.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/node.js";
export {
AsyncLocalStorage,
+6
View File
@@ -13,4 +13,10 @@ export function getEnv(name: string): string | undefined {
return INTERNAL_ENV[name];
}
export {
loadTransformers,
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./multi-model/index.non-nodejs.js";
export { Tokenizers, tokenizers, type Tokenizer } from "./tokenizers/js.js";
+20
View File
@@ -0,0 +1,20 @@
import { getTransformers, setTransformers, type OnLoad } from "./shared.js";
export {
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./shared.js";
export async function loadTransformers(onLoad: OnLoad) {
if (getTransformers() === null) {
setTransformers(
// @ts-expect-error
await import("https://cdn.jsdelivr.net/npm/@xenova/transformers@2.17.2"),
);
} else {
return getTransformers()!;
}
const transformer = getTransformers()!;
onLoad(transformer);
return transformer;
}
+35
View File
@@ -0,0 +1,35 @@
import { getTransformers, setTransformers, type OnLoad } from "./shared.js";
export {
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./shared.js";
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 "@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.
*
* 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/xenova/transformers.js/issues/309
*/
console.warn(
'"@xenova/transformers" is not officially supported in this environment, some features may not work as expected.',
);
setTransformers(
// @ts-expect-error
await import("@xenova/transformers/dist/transformers"),
);
} else {
return getTransformers()!;
}
const transformer = getTransformers()!;
onLoad(transformer);
return transformer;
}
+20
View File
@@ -0,0 +1,20 @@
import { getTransformers, setTransformers, type OnLoad } from "./shared.js";
export {
setTransformers,
type LoadTransformerEvent,
type OnLoad,
} from "./shared.js";
export async function loadTransformers(onLoad: OnLoad) {
if (getTransformers() === null) {
setTransformers(await import("@xenova/transformers"));
} else {
return getTransformers()!;
}
const transformer = getTransformers()!;
onLoad(transformer);
return transformer;
}
+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");
};
+23
View File
@@ -1,5 +1,28 @@
# @llamaindex/experimental
## 0.0.84
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
## 0.0.83
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.82
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
## 0.0.81
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/experimental",
"description": "Experimental package for LlamaIndexTS",
"version": "0.0.81",
"version": "0.0.84",
"type": "module",
"types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js",
+36
View File
@@ -1,5 +1,41 @@
# llamaindex
## 0.6.6
### Patch Changes
- d902cc3: Fix context not being sent using ContextChatEngine
- 025ffe6: fix: update `PostgresKVStore` constructor params
- a659574: Adds upstash vector store as a storage
- Updated dependencies [d902cc3]
- @llamaindex/core@0.2.5
- @llamaindex/openai@0.1.7
- @llamaindex/groq@0.0.6
## 0.6.5
### Patch Changes
- e9714db: feat: update `PGVectorStore`
- move constructor parameter `config.user` | `config.database` | `config.password` | `config.connectionString` into `config.clientConfig`
- if you pass `pg.Client` or `pg.Pool` instance to `PGVectorStore`, move it to `config.client`, setting `config.shouldConnect` to false if it's already connected
- default value of `PGVectorStore.collection` is now `"data"` instead of `""` (empty string)
## 0.6.4
### Patch Changes
- b48bcc3: feat: add `load-transformers` event type when loading `@xenova/transformers` module
This would benefit user who want to customize the transformer env.
- Updated dependencies [b48bcc3]
- @llamaindex/core@0.2.4
- @llamaindex/env@0.1.12
- @llamaindex/openai@0.1.6
- @llamaindex/groq@0.0.5
## 0.6.3
### Patch Changes
@@ -1,5 +1,28 @@
# @llamaindex/cloudflare-worker-agent-test
## 0.0.68
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
## 0.0.67
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.66
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
## 0.0.65
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/cloudflare-worker-agent-test",
"version": "0.0.65",
"version": "0.0.68",
"type": "module",
"private": true,
"scripts": {
@@ -1,5 +1,28 @@
# @llamaindex/next-agent-test
## 0.1.68
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
## 0.1.67
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.1.66
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
## 0.1.65
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-agent-test",
"version": "0.1.65",
"version": "0.1.68",
"private": true,
"scripts": {
"dev": "next dev",
@@ -1,5 +1,28 @@
# test-edge-runtime
## 0.1.67
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
## 0.1.66
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.1.65
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
## 0.1.64
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/nextjs-edge-runtime-test",
"version": "0.1.64",
"version": "0.1.67",
"private": true,
"scripts": {
"dev": "next dev",
@@ -1,107 +0,0 @@
:root {
--max-width: 1100px;
--border-radius: 12px;
--font-mono: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono",
"Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro",
"Fira Mono", "Droid Sans Mono", "Courier New", monospace;
--foreground-rgb: 0, 0, 0;
--background-start-rgb: 214, 219, 220;
--background-end-rgb: 255, 255, 255;
--primary-glow: conic-gradient(
from 180deg at 50% 50%,
#16abff33 0deg,
#0885ff33 55deg,
#54d6ff33 120deg,
#0071ff33 160deg,
transparent 360deg
);
--secondary-glow: radial-gradient(
rgba(255, 255, 255, 1),
rgba(255, 255, 255, 0)
);
--tile-start-rgb: 239, 245, 249;
--tile-end-rgb: 228, 232, 233;
--tile-border: conic-gradient(
#00000080,
#00000040,
#00000030,
#00000020,
#00000010,
#00000010,
#00000080
);
--callout-rgb: 238, 240, 241;
--callout-border-rgb: 172, 175, 176;
--card-rgb: 180, 185, 188;
--card-border-rgb: 131, 134, 135;
}
@media (prefers-color-scheme: dark) {
:root {
--foreground-rgb: 255, 255, 255;
--background-start-rgb: 0, 0, 0;
--background-end-rgb: 0, 0, 0;
--primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0));
--secondary-glow: linear-gradient(
to bottom right,
rgba(1, 65, 255, 0),
rgba(1, 65, 255, 0),
rgba(1, 65, 255, 0.3)
);
--tile-start-rgb: 2, 13, 46;
--tile-end-rgb: 2, 5, 19;
--tile-border: conic-gradient(
#ffffff80,
#ffffff40,
#ffffff30,
#ffffff20,
#ffffff10,
#ffffff10,
#ffffff80
);
--callout-rgb: 20, 20, 20;
--callout-border-rgb: 108, 108, 108;
--card-rgb: 100, 100, 100;
--card-border-rgb: 200, 200, 200;
}
}
* {
box-sizing: border-box;
padding: 0;
margin: 0;
}
html,
body {
max-width: 100vw;
overflow-x: hidden;
}
body {
color: rgb(var(--foreground-rgb));
background: linear-gradient(
to bottom,
transparent,
rgb(var(--background-end-rgb))
)
rgb(var(--background-start-rgb));
}
a {
color: inherit;
text-decoration: none;
}
@media (prefers-color-scheme: dark) {
html {
color-scheme: dark;
}
}
@@ -1,6 +1,6 @@
// test runtime
import "llamaindex";
import { ClipEmbedding } from "llamaindex/embeddings/ClipEmbedding";
import { ClipEmbedding } from "llamaindex";
import "llamaindex/readers/SimpleDirectoryReader";
// @ts-expect-error
@@ -1,5 +1,28 @@
# @llamaindex/next-node-runtime
## 0.0.49
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
## 0.0.48
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.47
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
## 0.0.46
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-node-runtime-test",
"version": "0.0.46",
"version": "0.0.49",
"private": true,
"scripts": {
"dev": "next dev",
@@ -1,5 +1,28 @@
# @llamaindex/waku-query-engine-test
## 0.0.68
### Patch Changes
- Updated dependencies [d902cc3]
- Updated dependencies [025ffe6]
- Updated dependencies [a659574]
- llamaindex@0.6.6
## 0.0.67
### Patch Changes
- Updated dependencies [e9714db]
- llamaindex@0.6.5
## 0.0.66
### Patch Changes
- Updated dependencies [b48bcc3]
- llamaindex@0.6.4
## 0.0.65
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/waku-query-engine-test",
"version": "0.0.65",
"version": "0.0.68",
"type": "module",
"private": true,
"scripts": {
@@ -1,8 +1,41 @@
import { ClipEmbedding, ImageNode } from "llamaindex";
import type { LoadTransformerEvent } from "@llamaindex/env";
import { setTransformers } from "@llamaindex/env";
import { ClipEmbedding, ImageNode, Settings } from "llamaindex";
import assert from "node:assert";
import { test } from "node:test";
import { type Mock, test } from "node:test";
let callback: Mock<(event: any) => void>;
test.before(() => {
callback = test.mock.fn((event: any) => {
const { transformer } = event.detail as LoadTransformerEvent;
assert.ok(transformer);
assert.ok(transformer.env);
});
Settings.callbackManager.on("load-transformers", callback);
});
test.beforeEach(() => {
callback.mock.resetCalls();
});
await test("clip embedding", async (t) => {
await t.test("should trigger load transformer event", async () => {
const nodes = [
new ImageNode({
image: new URL(
"../../fixtures/img/llamaindex-white.png",
import.meta.url,
),
}),
];
assert.equal(callback.mock.callCount(), 0);
const clipEmbedding = new ClipEmbedding();
assert.equal(callback.mock.callCount(), 0);
const result = await clipEmbedding(nodes);
assert.strictEqual(result.length, 1);
assert.equal(callback.mock.callCount(), 1);
});
await t.test("init & get image embedding", async () => {
const clipEmbedding = new ClipEmbedding();
const imgUrl = new URL(
@@ -27,4 +60,25 @@ await test("clip embedding", async (t) => {
assert.strictEqual(result.length, 1);
assert.ok(result[0]!.embedding);
});
await t.test("custom transformer", async () => {
const transformers = await import("@xenova/transformers");
const getter = test.mock.fn((t, k, r) => {
return Reflect.get(t, k, r);
});
setTransformers(
new Proxy(transformers, {
get: getter,
}),
);
const clipEmbedding = new ClipEmbedding();
const imgUrl = new URL(
"../../fixtures/img/llamaindex-white.png",
import.meta.url,
);
assert.equal(getter.mock.callCount(), 0);
const vec = await clipEmbedding.getImageEmbedding(imgUrl);
assert.ok(vec);
assert.ok(getter.mock.callCount() > 0);
});
});
@@ -9,43 +9,54 @@ import { registerTypes } from "pgvector/pg";
config({ path: [".env.local", ".env", ".env.ci"] });
let pgClient: pg.Client | pg.Pool;
test.afterEach(async () => {
await pgClient.end();
});
const pgConfig = {
user: process.env.POSTGRES_USER ?? "user",
password: process.env.POSTGRES_PASSWORD ?? "password",
database: "llamaindex_node_test",
};
await test("init with client", async () => {
pgClient = new pg.Client(pgConfig);
await test("init with client", async (t) => {
const pgClient = new pg.Client(pgConfig);
await pgClient.connect();
await pgClient.query("CREATE EXTENSION IF NOT EXISTS vector");
await registerTypes(pgClient);
const vectorStore = new PGVectorStore(pgClient);
t.after(async () => {
await pgClient.end();
});
const vectorStore = new PGVectorStore({
client: pgClient,
shouldConnect: false,
});
assert.deepStrictEqual(await vectorStore.client(), pgClient);
});
await test("init with pool", async () => {
pgClient = new pg.Pool(pgConfig);
await test("init with pool", async (t) => {
const pgClient = new pg.Pool(pgConfig);
await pgClient.query("CREATE EXTENSION IF NOT EXISTS vector");
const client = await pgClient.connect();
await client.query("CREATE EXTENSION IF NOT EXISTS vector");
await registerTypes(client);
const vectorStore = new PGVectorStore(client);
t.after(async () => {
client.release();
await pgClient.end();
});
const vectorStore = new PGVectorStore({
shouldConnect: false,
client,
});
assert.deepStrictEqual(await vectorStore.client(), client);
client.release();
});
await test("init without client", async () => {
const vectorStore = new PGVectorStore(pgConfig);
pgClient = (await vectorStore.client()) as pg.Client;
await test("init without client", async (t) => {
const vectorStore = new PGVectorStore({ clientConfig: pgConfig });
const pgClient = (await vectorStore.client()) as pg.Client;
t.after(async () => {
await pgClient.end();
});
assert.notDeepStrictEqual(pgClient, undefined);
});
await test("simple node", async () => {
await test("simple node", async (t) => {
const dimensions = 3;
const schemaName =
"llamaindex_vector_store_test_" + Math.random().toString(36).substring(7);
@@ -56,10 +67,14 @@ await test("simple node", async () => {
embedding: [0.1, 0.2, 0.3],
});
const vectorStore = new PGVectorStore({
...pgConfig,
clientConfig: pgConfig,
dimensions,
schemaName,
});
const pgClient = (await vectorStore.client()) as pg.Client;
t.after(async () => {
await pgClient.end();
});
await vectorStore.add([node]);
@@ -89,6 +104,4 @@ await test("simple node", async () => {
});
assert.deepStrictEqual(result.nodes, []);
}
pgClient = (await vectorStore.client()) as pg.Client;
});
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "llamaindex",
"version": "0.6.3",
"version": "0.6.6",
"license": "MIT",
"type": "module",
"keywords": [
@@ -33,8 +33,8 @@
"@llamaindex/cloud": "workspace:*",
"@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*",
"@llamaindex/openai": "workspace:*",
"@llamaindex/groq": "workspace:*",
"@llamaindex/openai": "workspace:*",
"@mistralai/mistralai": "^1.0.4",
"@mixedbread-ai/sdk": "^2.2.11",
"@pinecone-database/pinecone": "^3.0.2",
@@ -43,7 +43,7 @@
"@types/node": "^22.5.1",
"@types/papaparse": "^5.3.14",
"@types/pg": "^8.11.8",
"@xenova/transformers": "^2.17.2",
"@upstash/vector": "^1.1.5",
"@zilliz/milvus2-sdk-node": "^2.4.6",
"ajv": "^8.17.1",
"assemblyai": "^4.7.0",
@@ -91,6 +91,7 @@
"@notionhq/client": "^2.2.15",
"@swc/cli": "^0.4.0",
"@swc/core": "^1.7.22",
"@xenova/transformers": "^2.17.2",
"concurrently": "^8.2.2",
"glob": "^11.0.0",
"pg": "^8.12.0",
+7
View File
@@ -12,6 +12,7 @@ import {
type NodeParser,
SentenceSplitter,
} from "@llamaindex/core/node-parser";
import type { LoadTransformerEvent } from "@llamaindex/env";
import { AsyncLocalStorage, getEnv } from "@llamaindex/env";
import type { ServiceContext } from "./ServiceContext.js";
import {
@@ -20,6 +21,12 @@ import {
withEmbeddedModel,
} from "./internal/settings/EmbedModel.js";
declare module "@llamaindex/core/global" {
interface LlamaIndexEventMaps {
"load-transformers": LoadTransformerEvent;
}
}
export type PromptConfig = {
llm?: string;
lang?: string;
+2 -3
View File
@@ -356,9 +356,8 @@ export abstract class AgentRunner<
let chatHistory: ChatMessage<AdditionalMessageOptions>[] = [];
if (params.chatHistory instanceof BaseMemory) {
chatHistory = (await params.chatHistory.getMessages(
params.message,
)) as ChatMessage<AdditionalMessageOptions>[];
chatHistory =
(await params.chatHistory.getMessages()) as ChatMessage<AdditionalMessageOptions>[];
} else {
chatHistory =
params.chatHistory as ChatMessage<AdditionalMessageOptions>[];
@@ -1,17 +1,26 @@
import { MultiModalEmbedding } from "@llamaindex/core/embeddings";
import type { ImageType } from "@llamaindex/core/schema";
import _ from "lodash";
import { lazyLoadTransformers } from "../internal/deps/transformers.js";
// only import type, to avoid bundling error
import { loadTransformers } from "@llamaindex/env";
import type {
CLIPTextModelWithProjection,
CLIPVisionModelWithProjection,
PreTrainedTokenizer,
Processor,
} from "@xenova/transformers";
import { Settings } from "../Settings.js";
async function readImage(input: ImageType) {
const { RawImage } = await lazyLoadTransformers();
const { RawImage } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
if (input instanceof Blob) {
return await RawImage.fromBlob(input);
} else if (_.isString(input) || input instanceof URL) {
@@ -40,7 +49,15 @@ export class ClipEmbedding extends MultiModalEmbedding {
}
async getTokenizer() {
const { AutoTokenizer } = await lazyLoadTransformers();
const { AutoTokenizer } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
if (!this.tokenizer) {
this.tokenizer = await AutoTokenizer.from_pretrained(this.modelType);
}
@@ -48,7 +65,15 @@ export class ClipEmbedding extends MultiModalEmbedding {
}
async getProcessor() {
const { AutoProcessor } = await lazyLoadTransformers();
const { AutoProcessor } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
if (!this.processor) {
this.processor = await AutoProcessor.from_pretrained(this.modelType);
}
@@ -56,7 +81,17 @@ export class ClipEmbedding extends MultiModalEmbedding {
}
async getVisionModel() {
const { CLIPVisionModelWithProjection } = await lazyLoadTransformers();
const { CLIPVisionModelWithProjection } = await loadTransformers(
(transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
},
);
if (!this.visionModel) {
this.visionModel = await CLIPVisionModelWithProjection.from_pretrained(
this.modelType,
@@ -67,7 +102,17 @@ export class ClipEmbedding extends MultiModalEmbedding {
}
async getTextModel() {
const { CLIPTextModelWithProjection } = await lazyLoadTransformers();
const { CLIPTextModelWithProjection } = await loadTransformers(
(transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
},
);
if (!this.textModel) {
this.textModel = await CLIPTextModelWithProjection.from_pretrained(
this.modelType,
@@ -1,6 +1,7 @@
import { HfInference } from "@huggingface/inference";
import { BaseEmbedding } from "@llamaindex/core/embeddings";
import { lazyLoadTransformers } from "../internal/deps/transformers.js";
import { loadTransformers } from "@llamaindex/env";
import { Settings } from "../Settings.js";
export enum HuggingFaceEmbeddingModelType {
XENOVA_ALL_MINILM_L6_V2 = "Xenova/all-MiniLM-L6-v2",
@@ -33,7 +34,15 @@ export class HuggingFaceEmbedding extends BaseEmbedding {
async getExtractor() {
if (!this.extractor) {
const { pipeline } = await lazyLoadTransformers();
const { pipeline } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
this.extractor = await pipeline("feature-extraction", this.modelType, {
quantized: this.quantized,
});
@@ -9,3 +9,5 @@ export * from "./MixedbreadAIEmbeddings.js";
export { OllamaEmbedding } from "./OllamaEmbedding.js";
export * from "./OpenAIEmbedding.js";
export { TogetherEmbedding } from "./together.js";
// ClipEmbedding might not work in non-node.js runtime, but it doesn't have side effects
export { ClipEmbedding, ClipEmbeddingModelType } from "./ClipEmbedding.js";
@@ -78,9 +78,7 @@ export class CondenseQuestionChatEngine
}
private async condenseQuestion(chatHistory: BaseMemory, question: string) {
const chatHistoryStr = messagesToHistory(
await chatHistory.getMessages(question),
);
const chatHistoryStr = messagesToHistory(await chatHistory.getMessages());
return this.llm.complete({
prompt: this.condenseMessagePrompt.format({
@@ -103,7 +101,7 @@ export class CondenseQuestionChatEngine
? new ChatMemoryBuffer({
chatHistory:
params.chatHistory instanceof BaseMemory
? await params.chatHistory.getMessages(message)
? await params.chatHistory.getMessages()
: params.chatHistory,
})
: this.chatHistory;
@@ -92,7 +92,7 @@ export class ContextChatEngine extends PromptMixin implements ChatEngine {
? new ChatMemoryBuffer({
chatHistory:
params.chatHistory instanceof BaseMemory
? await params.chatHistory.getMessages(message)
? await params.chatHistory.getMessages()
: params.chatHistory,
})
: this.chatHistory;
@@ -139,7 +139,7 @@ export class ContextChatEngine extends PromptMixin implements ChatEngine {
const textOnly = extractText(message);
const context = await this.contextGenerator.generate(textOnly);
const systemMessage = this.prependSystemPrompt(context.message);
const messages = await chatHistory.getMessages(systemMessage.content);
const messages = await chatHistory.getMessages([systemMessage]);
return { nodes: context.nodes, messages };
}
@@ -40,7 +40,7 @@ export class SimpleChatEngine implements ChatEngine {
? new ChatMemoryBuffer({
chatHistory:
params.chatHistory instanceof BaseMemory
? await params.chatHistory.getMessages(message)
? await params.chatHistory.getMessages()
: params.chatHistory,
})
: this.chatHistory;
@@ -48,7 +48,7 @@ export class SimpleChatEngine implements ChatEngine {
if (stream) {
const stream = await this.llm.chat({
messages: await chatHistory.getMessages(params.message),
messages: await chatHistory.getMessages(),
stream: true,
});
return streamConverter(
@@ -66,7 +66,7 @@ export class SimpleChatEngine implements ChatEngine {
const response = await this.llm.chat({
stream: false,
messages: await chatHistory.getMessages(params.message),
messages: await chatHistory.getMessages(),
});
chatHistory.put(response.message);
return EngineResponse.fromChatResponse(response);
-4
View File
@@ -2,10 +2,6 @@ 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 {
ClipEmbedding,
ClipEmbeddingModelType,
} from "./embeddings/ClipEmbedding.js";
export {
HuggingFaceEmbedding,
HuggingFaceEmbeddingModelType,
@@ -1,15 +0,0 @@
let transformer: typeof import("@xenova/transformers") | null = null;
export async function lazyLoadTransformers() {
if (!transformer) {
transformer = await import("@xenova/transformers");
}
// @ts-expect-error
if (typeof EdgeRuntime === "string") {
// there is no local file system in the edge runtime
transformer.env.allowLocalModels = false;
}
// fixme: handle cloudflare workers case here?
return transformer;
}
+20 -3
View File
@@ -11,12 +11,13 @@ import {
type ToolCallLLMMessageOptions,
} from "@llamaindex/core/llms";
import { streamConverter, wrapLLMEvent } from "@llamaindex/core/utils";
import { loadTransformers } from "@llamaindex/env";
import type {
PreTrainedModel,
PreTrainedTokenizer,
Tensor,
} from "@xenova/transformers";
import { lazyLoadTransformers } from "../internal/deps/transformers.js";
import { Settings } from "../Settings.js";
// TODO workaround issue with @huggingface/inference@2.7.0
interface HfInferenceOptions {
@@ -225,7 +226,15 @@ export class HuggingFaceLLM extends BaseLLM {
}
async getTokenizer() {
const { AutoTokenizer } = await lazyLoadTransformers();
const { AutoTokenizer } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
if (!this.tokenizer) {
this.tokenizer = await AutoTokenizer.from_pretrained(this.tokenizerName);
}
@@ -233,7 +242,15 @@ export class HuggingFaceLLM extends BaseLLM {
}
async getModel() {
const { AutoModelForCausalLM } = await lazyLoadTransformers();
const { AutoModelForCausalLM } = await loadTransformers((transformer) => {
Settings.callbackManager.dispatchEvent(
"load-transformers",
{
transformer,
},
true,
);
});
if (!this.model) {
this.model = await AutoModelForCausalLM.from_pretrained(this.modelName);
}
@@ -1,19 +1,29 @@
import { DEFAULT_NAMESPACE } from "@llamaindex/core/global";
import { PostgresKVStore } from "../kvStore/PostgresKVStore.js";
import {
PostgresKVStore,
type PostgresKVStoreConfig,
} from "../kvStore/PostgresKVStore.js";
import { KVDocumentStore } from "./KVDocumentStore.js";
const DEFAULT_TABLE_NAME = "llamaindex_doc_store";
export type PostgresDocumentStoreConfig = PostgresKVStoreConfig & {
namespace?: string;
};
export class PostgresDocumentStore extends KVDocumentStore {
constructor(config?: {
schemaName?: string;
tableName?: string;
connectionString?: string;
namespace?: string;
}) {
constructor(config?: PostgresDocumentStoreConfig) {
const kvStore = new PostgresKVStore({
schemaName: config?.schemaName,
tableName: config?.tableName || DEFAULT_TABLE_NAME,
...(config && "clientConfig" in config
? { clientConfig: config.clientConfig }
: config && "client" in config
? {
client: config.client,
shouldConnect: config.shouldConnect ?? false,
}
: {}),
});
const namespace = config?.namespace || DEFAULT_NAMESPACE;
super(kvStore, namespace);
@@ -1,19 +1,29 @@
import { DEFAULT_NAMESPACE } from "@llamaindex/core/global";
import { PostgresKVStore } from "../kvStore/PostgresKVStore.js";
import {
PostgresKVStore,
type PostgresKVStoreConfig,
} from "../kvStore/PostgresKVStore.js";
import { KVIndexStore } from "./KVIndexStore.js";
const DEFAULT_TABLE_NAME = "llamaindex_index_store";
export type PostgresIndexStoreConfig = PostgresKVStoreConfig & {
namespace?: string;
};
export class PostgresIndexStore extends KVIndexStore {
constructor(config?: {
schemaName?: string;
tableName?: string;
connectionString?: string;
namespace?: string;
}) {
constructor(config?: PostgresIndexStoreConfig) {
const kvStore = new PostgresKVStore({
schemaName: config?.schemaName,
tableName: config?.tableName || DEFAULT_TABLE_NAME,
...(config && "clientConfig" in config
? { clientConfig: config.clientConfig }
: config && "client" in config
? {
client: config.client,
shouldConnect: config.shouldConnect ?? false,
}
: {}),
});
const namespace = config?.namespace || DEFAULT_NAMESPACE;
super(kvStore, namespace);
@@ -7,41 +7,76 @@ export type DataType = Record<string, Record<string, any>>;
const DEFAULT_SCHEMA_NAME = "public";
const DEFAULT_TABLE_NAME = "llamaindex_kv_store";
export type PostgresKVStoreBaseConfig = {
schemaName?: string | undefined;
tableName?: string | undefined;
};
export type PostgresKVStoreClientConfig =
| {
/**
* Client configuration options for the pg client.
*
* {@link https://node-postgres.com/apis/client#new-client PostgresSQL Client API}
*/
clientConfig?: pg.ClientConfig | undefined;
}
| {
/**
* A pg client or pool client instance.
* If provided, make sure it is not connected to the database yet, or it will throw an error.
*/
shouldConnect?: boolean | undefined;
client?: pg.Client | pg.PoolClient;
};
export type PostgresKVStoreConfig = PostgresKVStoreBaseConfig &
PostgresKVStoreClientConfig;
export class PostgresKVStore extends BaseKVStore {
private schemaName: string;
private tableName: string;
private connectionString: string | undefined = undefined;
private db?: pg.Client;
constructor(config?: {
schemaName?: string | undefined;
tableName?: string | undefined;
connectionString?: string | undefined;
}) {
private isDBConnected: boolean = false;
private clientConfig: pg.ClientConfig | undefined = undefined;
private db?: pg.ClientBase | undefined = undefined;
constructor(config?: PostgresKVStoreConfig) {
super();
this.schemaName = config?.schemaName || DEFAULT_SCHEMA_NAME;
this.tableName = config?.tableName || DEFAULT_TABLE_NAME;
this.connectionString = config?.connectionString;
}
private async getDb(): Promise<pg.Client> {
if (!this.db) {
try {
const pg = await import("pg");
const { Client } = pg.default ? pg.default : pg;
const db = new Client({ connectionString: this.connectionString });
await db.connect();
await this.checkSchema(db);
this.db = db;
} catch (err) {
console.error(err);
return Promise.reject(err instanceof Error ? err : new Error(`${err}`));
if (config) {
if ("clientConfig" in config) {
this.clientConfig = config.clientConfig;
} else if ("client" in config) {
this.isDBConnected =
config?.shouldConnect !== undefined ? !config.shouldConnect : false;
this.db = config.client;
}
}
return Promise.resolve(this.db);
}
private async checkSchema(db: pg.Client) {
private async getDb(): Promise<pg.ClientBase> {
if (!this.db) {
const pg = await import("pg");
const { Client } = pg.default ? pg.default : pg;
const db = new Client({ ...this.clientConfig });
await db.connect();
this.isDBConnected = true;
this.db = db;
}
if (this.db && !this.isDBConnected) {
await this.db.connect();
this.isDBConnected = true;
}
this.db.on("end", () => {
this.isDBConnected = false;
});
await this.checkSchema(this.db);
return this.db;
}
private async checkSchema(db: pg.ClientBase) {
await db.query(`CREATE SCHEMA IF NOT EXISTS ${this.schemaName}`);
const tbl = `CREATE TABLE IF NOT EXISTS ${this.schemaName}.${this.tableName} (
id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
@@ -97,7 +132,7 @@ export class PostgresKVStore extends BaseKVStore {
const sql = `SELECT * FROM ${this.schemaName}.${this.tableName} WHERE key = $1 AND collection = $2`;
const result = await db.query(sql, [key, collection]);
await db.query("COMMIT");
return result.rows[0].value;
return result.rows[0]?.value;
} catch (error) {
await db.query("ROLLBACK");
throw error;
@@ -14,25 +14,44 @@ import {
import { escapeLikeString } from "./utils.js";
import type { BaseEmbedding } from "@llamaindex/core/embeddings";
import { DEFAULT_COLLECTION } from "@llamaindex/core/global";
import type { BaseNode, Metadata } from "@llamaindex/core/schema";
import { Document, MetadataMode } from "@llamaindex/core/schema";
export const PGVECTOR_SCHEMA = "public";
export const PGVECTOR_TABLE = "llamaindex_embedding";
export const DEFAULT_DIMENSIONS = 1536;
export type PGVectorStoreConfig = Pick<
pg.ClientConfig,
"user" | "database" | "password" | "connectionString"
> & {
type PGVectorStoreBaseConfig = {
schemaName?: string | undefined;
tableName?: string | undefined;
dimensions?: number | undefined;
embedModel?: BaseEmbedding | undefined;
};
export type PGVectorStoreConfig = PGVectorStoreBaseConfig &
(
| {
/**
* Client configuration options for the pg client.
*
* {@link https://node-postgres.com/apis/client#new-client PostgresSQL Client API}
*/
clientConfig: pg.ClientConfig;
}
| {
/**
* A pg client or pool client instance.
* If provided, make sure it is not connected to the database yet, or it will throw an error.
*/
shouldConnect?: boolean | undefined;
client: pg.Client | pg.PoolClient;
}
);
/**
* Provides support for writing and querying vector data in Postgres.
* Note: Can't be used with data created using the Python version of the vector store (https://docs.llamaindex.ai/en/stable/examples/vector_stores/postgres.html)
* Note: Can't be used with data created using the Python version of the vector store (https://docs.llamaindex.ai/en/stable/examples/vector_stores/postgres/)
*/
export class PGVectorStore
extends VectorStoreBase
@@ -40,52 +59,26 @@ export class PGVectorStore
{
storesText: boolean = true;
private collection: string = "";
private schemaName: string = PGVECTOR_SCHEMA;
private tableName: string = PGVECTOR_TABLE;
private collection: string = DEFAULT_COLLECTION;
private readonly schemaName: string = PGVECTOR_SCHEMA;
private readonly tableName: string = PGVECTOR_TABLE;
private readonly dimensions: number = DEFAULT_DIMENSIONS;
private user: pg.ClientConfig["user"] | undefined = undefined;
private password: pg.ClientConfig["password"] | undefined = undefined;
private database: pg.ClientConfig["database"] | undefined = undefined;
private connectionString: pg.ClientConfig["connectionString"] | undefined =
undefined;
private isDBConnected: boolean = false;
private db: pg.ClientBase | null = null;
private readonly clientConfig: pg.ClientConfig | null = null;
private dimensions: number = 1536;
private db?: pg.ClientBase;
/**
* Constructs a new instance of the PGVectorStore
*
* If the `connectionString` is not provided the following env variables are
* used to connect to the DB:
* PGHOST=your database host
* PGUSER=your database user
* PGPASSWORD=your database password
* PGDATABASE=your database name
* PGPORT=your database port
*/
constructor(configOrClient?: PGVectorStoreConfig | pg.ClientBase) {
// We cannot import pg from top level, it might have side effects
// so we only check if the config.connect function exists
if (
configOrClient &&
"connect" in configOrClient &&
typeof configOrClient.connect === "function"
) {
const db = configOrClient as pg.ClientBase;
super();
this.db = db;
constructor(config: PGVectorStoreConfig) {
super(config?.embedModel);
this.schemaName = config?.schemaName ?? PGVECTOR_SCHEMA;
this.tableName = config?.tableName ?? PGVECTOR_TABLE;
this.dimensions = config?.dimensions ?? DEFAULT_DIMENSIONS;
if ("clientConfig" in config) {
this.clientConfig = config.clientConfig;
} else {
const config = configOrClient as PGVectorStoreConfig;
super(config?.embedModel);
this.schemaName = config?.schemaName ?? PGVECTOR_SCHEMA;
this.tableName = config?.tableName ?? PGVECTOR_TABLE;
this.user = config?.user;
this.password = config?.password;
this.database = config?.database;
this.connectionString = config?.connectionString;
this.dimensions = config?.dimensions ?? 1536;
this.isDBConnected =
config.shouldConnect !== undefined ? !config.shouldConnect : false;
this.db = config.client;
}
}
@@ -113,39 +106,41 @@ export class PGVectorStore
private async getDb(): Promise<pg.ClientBase> {
if (!this.db) {
try {
const pg = await import("pg");
const { Client } = pg.default ? pg.default : pg;
const pg = await import("pg");
const { Client } = pg.default ? pg.default : pg;
const { registerType } = await import("pgvector/pg");
// Create DB connection
// Read connection params from env - see comment block above
const db = new Client({
user: this.user,
password: this.password,
database: this.database,
connectionString: this.connectionString,
});
await db.connect();
const { registerTypes } = await import("pgvector/pg");
// Create DB connection
// Read connection params from env - see comment block above
const db = new Client({
...this.clientConfig,
});
// Check vector extension
await db.query("CREATE EXTENSION IF NOT EXISTS vector");
await registerType(db);
await db.connect();
this.isDBConnected = true;
// All good? Keep the connection reference
this.db = db;
} catch (err) {
console.error(err);
return Promise.reject(err instanceof Error ? err : new Error(`${err}`));
}
// Check vector extension
await db.query("CREATE EXTENSION IF NOT EXISTS vector");
await registerTypes(db);
// All good? Keep the connection reference
this.db = db;
}
const db = this.db;
if (this.db && !this.isDBConnected) {
await this.db.connect();
this.isDBConnected = true;
}
this.db.on("end", () => {
// Connection closed
this.isDBConnected = false;
});
// Check schema, table(s), index(es)
await this.checkSchema(db);
await this.checkSchema(this.db);
return Promise.resolve(this.db);
return this.db;
}
private async checkSchema(db: pg.ClientBase) {
@@ -0,0 +1,237 @@
import {
VectorStoreBase,
type IEmbedModel,
type MetadataFilter,
type MetadataFilters,
type VectorStoreNoEmbedModel,
type VectorStoreQuery,
type VectorStoreQueryResult,
} from "./types.js";
import type { BaseNode, Metadata, TextNode } from "@llamaindex/core/schema";
import { getEnv } from "@llamaindex/env";
import { Index } from "@upstash/vector";
import { metadataDictToNode, nodeToMetadata } from "./utils.js";
type UpstashParams = {
namespace?: string;
token?: string;
endpoint?: string;
maxBatchSize?: number;
} & IEmbedModel;
/**
* Provides support for writing and querying vector data in Upstash.
*/
export class UpstashVectorStore
extends VectorStoreBase
implements VectorStoreNoEmbedModel
{
storesText: boolean = true;
private db: Index;
private maxBatchSize: number;
namespace: string;
/**
* @param namespace namespace to use
* @param token upstash vector token. if not set, `process.env.UPSTASH_VECTOR_REST_TOKEN` is used.
* @param endpoint upstash vector endpoint. If not set, `process.env.UPSTASH_VECTOR_REST_URL` is used.
* @param maxBatchSize maximum number of vectors upserted at once. Default is 1000.
*
* @example
* ```ts
* const vectorStore = new UpstashVectorStore({ namespace: "my-namespace" })
* ```
*/
constructor(params?: UpstashParams) {
super(params?.embedModel);
this.namespace = params?.namespace ?? "";
this.maxBatchSize = params?.maxBatchSize ?? 1000;
const token = params?.token ?? getEnv("UPSTASH_VECTOR_REST_TOKEN");
const endpoint = params?.endpoint ?? getEnv("UPSTASH_VECTOR_REST_URL");
if (!token) {
throw new Error(
"Must specify UPSTASH_VECTOR_REST_TOKEN via env variable.",
);
}
if (!endpoint) {
throw new Error("Must specify UPSTASH_VECTOR_REST_URL via env variable.");
}
this.db = new Index({ token, url: endpoint });
}
private async getDb(): Promise<Index> {
if (!this.db) {
const { Index } = await import("@upstash/vector");
this.db = new Index();
}
return this.db;
}
/**
* Connects to the database specified in environment vars.
* @returns A connection to the database, or the error encountered while connecting/setting up.
*/
client(): Promise<Index> {
return this.getDb();
}
/**
* Adds vector record(s) to the table.
* @param embeddingResults The Nodes to be inserted, optionally including metadata tuples.
* @returns ids of the embeddings (infered from the id_ field of embeddingResults objects)
*/
async add(embeddingResults: BaseNode<Metadata>[]): Promise<string[]> {
if (embeddingResults.length == 0) {
return [];
}
const nodes = embeddingResults.map(this.nodeToRecord);
const result = await this.upsertInBatches(nodes);
if (result != "OK") {
throw new Error("Failed to save chunk");
}
return nodes.map((node) => node.id);
}
/**
* Adds plain text record(s) to the table. Upstash take cares of embedding conversion.
* @param text The Nodes to be inserted, optionally including metadata tuples.
* @returns ids of the embeddings (infered from the id_ field of embeddingResults objects)
*/
async addPlainText(text: TextNode<Metadata>[]): Promise<string[]> {
if (text.length == 0) {
return [];
}
const nodes = text.map(this.textNodeToRecord);
const result = await this.upsertInBatches(nodes);
if (result != "OK") {
throw new Error("Failed to save chunk");
}
return nodes.map((node) => node.id);
}
private async upsertInBatches(
nodes:
| ReturnType<UpstashVectorStore["textNodeToRecord"]>[]
| ReturnType<UpstashVectorStore["nodeToRecord"]>[],
) {
const promises: Promise<string>[] = [];
for (let i = 0; i < nodes.length; i += this.maxBatchSize) {
const batch = nodes.slice(i, i + this.maxBatchSize);
promises.push(this.db.upsert(batch, { namespace: this.namespace }));
}
const results = await Promise.all(promises);
return results.every((result) => result === "OK") ? "OK" : "NOT-OK";
}
/**
* Deletes a single record from the database by id.
* NOTE: Uses the collection property controlled by setCollection/getCollection.
* @param refDocId Unique identifier for the record to delete.
* @returns Promise that resolves if the delete query did not throw an error.
*/
async delete(refDocId: string): Promise<void> {
await this.db.namespace(this.namespace).delete(refDocId);
}
/**
* Deletes a single record from the database by id.
* NOTE: Uses the collection property controlled by setCollection/getCollection.
* @param refDocId Unique identifier for the record to delete.
* @param deleteKwargs Required by VectorStore interface. Currently ignored.
* @returns Promise that resolves if the delete query did not throw an error.
*/
async deleteMany(refDocId: string[]): Promise<void> {
await this.db.namespace(this.namespace).delete(refDocId);
}
/**
* Query the vector store for the closest matching data to the query embeddings
* @param query The VectorStoreQuery to be used
* @param options Required by VectorStore interface. Currently ignored.
* @returns Zero or more Document instances with data from the vector store.
*/
async query(
query: VectorStoreQuery,
_options?: any,
): Promise<VectorStoreQueryResult> {
const filter = this.toUpstashFilter(query.filters);
const defaultOptions: any = {
vector: query.queryEmbedding,
topK: query.similarityTopK,
includeVectors: true,
includeMetadata: true,
filter,
};
const db = this.db;
const results = await db.query(defaultOptions, {
namespace: this.namespace,
});
const nodes = results.map((result) => {
const node = metadataDictToNode(result.metadata as Record<string, any>, {
fallback: {
id: result.id,
metadata: result.metadata,
embedding: result.vector,
},
});
return node;
});
const ret = {
nodes: nodes,
similarities: results.map((row) => row.score || 999),
ids: results.map((row) => String(row.id)),
};
return ret;
}
toFilterString(filter: MetadataFilter) {
return `${filter.key} ${filter.operator} ${filter.value}`;
}
toUpstashFilter(stdFilters?: MetadataFilters) {
if (!stdFilters?.filters) return;
for (const item of stdFilters.filters) {
if (item.operator === "==") {
//@ts-expect-error Upstash equal operator uses only one equal sign, so we have to replace it.
item.operator = "=";
}
}
const filterStrings = stdFilters.filters.map(this.toFilterString);
if (filterStrings.length === 1) {
return filterStrings[0];
}
return filterStrings.join(` ${stdFilters.condition ?? "and"} `);
}
nodeToRecord(node: BaseNode<Metadata>) {
const id: any = node.id_.length ? node.id_ : null;
return {
id: id,
vector: node.getEmbedding(),
metadata: nodeToMetadata(node),
};
}
textNodeToRecord(node: TextNode<Metadata>) {
const id: any = node.id_.length ? node.id_ : null;
return {
id,
data: node.text,
metadata: nodeToMetadata(node),
};
}
}
+14
View File
@@ -1,5 +1,19 @@
# @llamaindex/groq
## 0.0.6
### Patch Changes
- @llamaindex/openai@0.1.7
## 0.0.5
### Patch Changes
- Updated dependencies [b48bcc3]
- @llamaindex/env@0.1.12
- @llamaindex/openai@0.1.6
## 0.0.4
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/groq",
"description": "Groq Adapter for LlamaIndex",
"version": "0.0.4",
"version": "0.0.6",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/openai
## 0.1.7
### Patch Changes
- Updated dependencies [d902cc3]
- @llamaindex/core@0.2.5
## 0.1.6
### Patch Changes
- Updated dependencies [b48bcc3]
- @llamaindex/core@0.2.4
- @llamaindex/env@0.1.12
## 0.1.5
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/openai",
"description": "OpenAI Adapter for LlamaIndex",
"version": "0.1.5",
"version": "0.1.7",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
+23 -45
View File
@@ -167,7 +167,7 @@ importers:
version: link:../packages/llamaindex
mongodb:
specifier: ^6.7.0
version: 6.8.0(@aws-sdk/credential-providers@3.650.0(@aws-sdk/client-sso-oidc@3.650.0(@aws-sdk/client-sts@3.650.0)))
version: 6.8.0(@aws-sdk/credential-providers@3.650.0)
pathe:
specifier: ^1.1.2
version: 1.1.2
@@ -425,18 +425,12 @@ importers:
packages/env:
dependencies:
'@types/lodash':
specifier: ^4.17.7
version: 4.17.7
'@types/node':
specifier: ^22.5.1
version: 22.5.4
js-tiktoken:
specifier: ^1.0.12
version: 1.0.14
tiktoken:
specifier: ^1.0.15
version: 1.0.16
devDependencies:
'@aws-crypto/sha256-js':
specifier: ^5.2.0
@@ -447,12 +441,18 @@ importers:
'@swc/core':
specifier: ^1.7.22
version: 1.7.22(@swc/helpers@0.5.13)
'@xenova/transformers':
specifier: ^2.17.2
version: 2.17.2
concurrently:
specifier: ^8.2.2
version: 8.2.2
pathe:
specifier: ^1.1.2
version: 1.1.2
tiktoken:
specifier: ^1.0.16
version: 1.0.16
vitest:
specifier: ^2.0.5
version: 2.1.1(@edge-runtime/vm@4.0.3)(@types/node@22.5.4)(happy-dom@15.7.4)(msw@2.4.8(typescript@5.6.2))(terser@5.32.0)
@@ -565,9 +565,9 @@ importers:
'@types/pg':
specifier: ^8.11.8
version: 8.11.8
'@xenova/transformers':
specifier: ^2.17.2
version: 2.17.2
'@upstash/vector':
specifier: ^1.1.5
version: 1.1.5
'@zilliz/milvus2-sdk-node':
specifier: ^2.4.6
version: 2.4.6
@@ -606,7 +606,7 @@ importers:
version: 2.0.0
mongodb:
specifier: ^6.7.0
version: 6.8.0(@aws-sdk/credential-providers@3.650.0(@aws-sdk/client-sso-oidc@3.650.0(@aws-sdk/client-sts@3.650.0)))
version: 6.8.0(@aws-sdk/credential-providers@3.650.0)
notion-md-crawler:
specifier: ^1.0.0
version: 1.0.0(encoding@0.1.13)
@@ -656,6 +656,9 @@ importers:
'@swc/core':
specifier: ^1.7.22
version: 1.7.22(@swc/helpers@0.5.13)
'@xenova/transformers':
specifier: ^2.17.2
version: 2.17.2
concurrently:
specifier: ^8.2.2
version: 8.2.2
@@ -4511,6 +4514,9 @@ packages:
'@ungap/structured-clone@1.2.0':
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
'@upstash/vector@1.1.5':
resolution: {integrity: sha512-55+Beu/kCwjcnzg6fnMN06v9PYU1lv9NQfQwpjrJAQTH8GOprcRsQeyXBdNHKNzoQvRnVS0ENd5CDgFoljfrAw==}
'@vitejs/plugin-react@4.3.1':
resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==}
engines: {node: ^14.18.0 || >=16.0.0}
@@ -16426,6 +16432,8 @@ snapshots:
'@ungap/structured-clone@1.2.0': {}
'@upstash/vector@1.1.5': {}
'@vitejs/plugin-react@4.3.1(vite@5.4.2(@types/node@22.5.5)(terser@5.32.0))':
dependencies:
'@babel/core': 7.25.2
@@ -18506,7 +18514,7 @@ snapshots:
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0)
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0)
eslint-plugin-react: 7.35.0(eslint@8.57.0)
@@ -18554,25 +18562,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.3.7
enhanced-resolve: 5.17.1
eslint: 8.57.0
eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0)
fast-glob: 3.3.2
get-tsconfig: 4.8.0
is-bun-module: 1.1.0
is-glob: 4.0.3
optionalDependencies:
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- supports-color
eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0):
dependencies:
'@nolyfill/is-core-module': 1.0.39
@@ -18585,24 +18574,13 @@ snapshots:
is-bun-module: 1.1.0
is-glob: 4.0.3
optionalDependencies:
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@8.5.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- supports-color
eslint-module-utils@2.8.2(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.6.2)
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0)
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.8.2(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0):
dependencies:
debug: 3.2.7
@@ -18624,7 +18602,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0)
eslint-module-utils: 2.8.2(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -21357,7 +21335,7 @@ snapshots:
optionalDependencies:
'@aws-sdk/credential-providers': 3.650.0(@aws-sdk/client-sso-oidc@3.650.0(@aws-sdk/client-sts@3.650.0))
mongodb@6.8.0(@aws-sdk/credential-providers@3.650.0(@aws-sdk/client-sso-oidc@3.650.0(@aws-sdk/client-sts@3.650.0))):
mongodb@6.8.0(@aws-sdk/credential-providers@3.650.0):
dependencies:
'@mongodb-js/saslprep': 1.1.7
bson: 6.8.0