Compare commits

...

11 Commits

Author SHA1 Message Date
Alex Yang ca50443f7b Update .changeset/hip-windows-tease.md 2024-12-09 21:00:29 -08:00
Marcus Schiesser 1b60005018 Merge branch 'main' into ms/add-vercel-adapter 2024-12-10 11:19:47 +07:00
Qwertic d99d598491 Update typescript.mdx (#1557) 2024-12-09 19:52:15 -08:00
Gunnar Holwerda a0e6f57d9b Pass options through to userWebpack in withLlamaIndex (#1550) 2024-12-09 19:51:52 -08:00
Gunnar Holwerda e0f6cc3be1 fix: return actual source nodes with compact and refine response synt… (#1554) 2024-12-09 11:00:12 -08:00
Marcus Schiesser bc3e840b85 docs: changeset 2024-12-09 15:45:29 +07:00
Marcus Schiesser f73d4c335d add model to llamaindex tool adapter 2024-12-09 15:44:20 +07:00
Marcus Schiesser 24774b0477 feat: add vercelllm adapter 2024-12-09 15:22:55 +07:00
Jingyi Zhao 8386510d86 chore: add e2e working example for ingestion (#1543) 2024-12-04 17:36:00 -08:00
Marcus Schiesser b504303c66 fix: allow Node 18 again to make Stackblitz work (#1544) 2024-12-03 20:57:20 -08:00
Marcus Schiesser cf9a9356e0 fix: discord link (#1542) 2024-12-03 11:16:02 +07:00
25 changed files with 472 additions and 123 deletions
+6
View File
@@ -0,0 +1,6 @@
---
"llamaindex": patch
"@llamaindex/env": patch
---
Allow Node 18 again (throw run-time error if not possible) to make Stackblitz work
+5
View File
@@ -0,0 +1,5 @@
---
"@llamaindex/vercel": patch
---
Add VercelLLM (adapter to use any model provider from Vercel AI in LlamaIndex)
+5
View File
@@ -0,0 +1,5 @@
---
"@llamaindex/core": patch
---
The compact and refine response synthesizer (retrieved by using `getResponseSynthesizer('compact')`) has been fixed to return the original source nodes that were provided to it in its response. Previous to this it was returning the compacted text chunk documents.
+5
View File
@@ -0,0 +1,5 @@
---
"llamaindex": patch
---
withLlamaIndex now passes through webpack options to the passed in customized NextJS webpack config. Before it was only passing through the config.
+2 -2
View File
@@ -23,7 +23,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node-version: [20.x, 22.x, 23.x]
node-version: [18.x, 20.x, 22.x, 23.x]
name: E2E on Node.js ${{ matrix.node-version }}
runs-on: ubuntu-latest
steps:
@@ -53,7 +53,7 @@ jobs:
strategy:
fail-fast: false
matrix:
node-version: [20.x, 22.x, 23.x]
node-version: [18.x, 20.x, 22.x, 23.x]
name: Test on Node.js ${{ matrix.node-version }}
runs-on: ubuntu-latest
steps:
@@ -3,7 +3,9 @@ title: Vercel
description: Integrate LlamaIndex with Vercel's AI SDK
---
LlamaIndex provides integration with Vercel's AI SDK, allowing you to create powerful search and retrieval applications. Below are examples of how to use LlamaIndex with `streamText` from the Vercel AI SDK.
LlamaIndex provides integration with Vercel's AI SDK, allowing you to create powerful search and retrieval applications. You can:
- Use any of Vercel AI's [model providers](https://sdk.vercel.ai/docs/foundations/providers-and-models) as LLMs in LlamaIndex
- Use indexes (e.g. VectorStoreIndex, LlamaCloudIndex) from LlamaIndexTS in your Vercel AI applications
## Setup
@@ -13,7 +15,22 @@ First, install the required dependencies:
npm install @llamaindex/vercel ai
```
## Using Local Vector Store
## Using Vercel AI's Model Providers
Using the `VercelLLM` adapter, it's easy to use any of Vercel AI's [model providers](https://sdk.vercel.ai/docs/foundations/providers-and-models) as LLMs in LlamaIndex. Here's an example of how to use OpenAI's GPT-4o model:
```typescript
const llm = new VercelLLM({ model: openai("gpt-4o") });
const result = await llm.complete({
prompt: "What is the capital of France?",
stream: false, // Set to true if you want streaming responses
});
console.log(result.text);
```
## Use Indexes
### Using VectorStoreIndex
Here's how to create a simple vector store index and query it using Vercel's AI SDK:
@@ -29,22 +46,25 @@ const index = await VectorStoreIndex.fromDocuments([document]);
// Create a query tool
const queryTool = llamaindex({
model: openai("gpt-4"),
index,
description: "Search through the documents", // optional
});
// Use the tool with Vercel's AI SDK
streamText({
tools: { queryTool },
prompt: "Your question here",
model: openai("gpt-4"),
prompt: "Your question here",
tools: { queryTool },
onFinish({ response }) {
console.log("Response:", response.messages); // log the response
},
}).toDataStream();
```
## Using LlamaCloud
> Note: the Vercel AI model referenced in the `llamaindex` function is used by the response synthesizer to generate a response for the tool call.
### Using LlamaCloud
For production deployments, you can use LlamaCloud to store and manage your documents:
@@ -61,20 +81,21 @@ const index = await LlamaCloudIndex.fromDocuments({
// Use it the same way as VectorStoreIndex
const queryTool = llamaindex({
model: openai("gpt-4"),
index,
description: "Search through the documents",
});
// Use the tool with Vercel's AI SDK
streamText({
tools: { queryTool },
prompt: "Your question here",
model: openai("gpt-4"),
prompt: "Your question here",
tools: { queryTool },
}).toDataStream();
```
## Next Steps
1. Explore [LlamaCloud](https://cloud.llamaindex.ai/) for managed document storage and retrieval
2. Join our [Discord community](https://discord.gg/llamaindex) for support and discussions
2. Join our [Discord community](https://discord.gg/dGcwcsnxhU) for support and discussions
@@ -84,7 +84,7 @@ Imaging you put output file into `/dist/openai.js` but you are importing `llamai
}
```
In old module resolution, TypeScript will not be able to find the module because it is not follow the file structure, even you run `node index.js` successfully. (on Node.js >=16)
In old module resolution, TypeScript will not be able to find the module because it is not following the file structure, even you run `node index.js` successfully. (on Node.js >=16)
See more about [moduleResolution](https://www.typescriptlang.org/docs/handbook/modules/theory.html#module-resolution) or
[TypeScript 5.0 blog](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#--moduleresolution-bundler7).
+5
View File
@@ -21,6 +21,11 @@ test.beforeEach(() => {
});
await test("clip embedding", async (t) => {
const major = parseInt(process.versions.node.split(".")[0] ?? "0", 10);
if (major < 20) {
t.skip("Skip CLIP tests on Node.js < 20");
return;
}
await t.test("should trigger load transformer event", async () => {
const nodes = [
new ImageNode({
@@ -1,16 +1,15 @@
import fs from "node:fs/promises";
import {
Document,
IngestionPipeline,
MetadataMode,
OpenAIEmbedding,
SentenceSplitter,
VectorStoreIndex,
} from "llamaindex";
import fs from "node:fs/promises";
async function main() {
// Load essay from abramov.txt in Node
const path = "node_modules/llamaindex/examples/abramov.txt";
const path = "../node_modules/llamaindex/examples/abramov.txt";
const essay = await fs.readFile(path, "utf-8");
@@ -22,14 +21,23 @@ async function main() {
new OpenAIEmbedding(),
],
});
console.time("Pipeline Run Time");
// run the pipeline
const nodes = await pipeline.run({ documents: [document] });
// print out the result of the pipeline run
for (const node of nodes) {
console.log(node.getContent(MetadataMode.NONE));
}
console.timeEnd("Pipeline Run Time");
// initialize the VectorStoreIndex from nodes
const index = await VectorStoreIndex.init({ nodes });
// Query the index
const queryEngine = index.asQueryEngine();
const { message } = await queryEngine.query({
query: "summarize the article in three sentence",
});
console.log(message);
}
main().catch(console.error);
+10
View File
@@ -14,6 +14,16 @@ npm i
Make sure to run the examples from the parent folder called `examples`. The following examples are available:
### Vercel LLM Example
Run the Vercel LLM example with:
```bash
npx tsx vercel/llm.ts
```
This example demonstrates using the `VercelLLM` adapter with Vercel's OpenAI model provider
### Vector Store Example
Run the local vector store example with:
+1
View File
@@ -22,6 +22,7 @@ async function main() {
prompt: "Cost of moving cat from Russia to UK?",
tools: {
queryTool: llamaindex({
model: openai("gpt-4o"),
index,
description:
"get information from your knowledge base to answer questions.", // optional description
+45
View File
@@ -0,0 +1,45 @@
import { openai } from "@ai-sdk/openai";
import { VercelLLM } from "@llamaindex/vercel";
import { LLMAgent, WikipediaTool } from "llamaindex";
async function main() {
// Create an instance of VercelLLM with the OpenAI model
const vercelLLM = new VercelLLM({ model: openai("gpt-4o") });
console.log("\n=== Test 1: Using complete() for single response ===");
const result = await vercelLLM.complete({
prompt: "What is the capital of France?",
stream: false, // Set to true if you want streaming responses
});
console.log(result.text);
console.log("\n=== Test 2: Using chat() for streaming response ===");
const stream = await vercelLLM.chat({
messages: [
{ content: "You want to talk in rhymes.", role: "system" },
{
content:
"How much wood would a woodchuck chuck if a woodchuck could chuck wood?",
role: "user",
},
],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.delta);
}
console.log("\n=== Test 3: Using LLMAgent with WikipediaTool ===");
const agent = new LLMAgent({
llm: vercelLLM,
tools: [new WikipediaTool()],
});
const { message } = await agent.chat({
message: "What's the history of New York from Wikipedia in 3 sentences?",
});
console.log(message);
}
main().catch(console.error);
+1
View File
@@ -18,6 +18,7 @@ async function main() {
prompt: "Cost of moving cat from Russia to UK?",
tools: {
queryTool: llamaindex({
model: openai("gpt-4o"),
index,
description:
"get information from your knowledge base to answer questions.", // optional description
@@ -77,6 +77,16 @@ class Refine extends BaseSynthesizer {
}
}
async getResponse(
query: MessageContent,
nodes: NodeWithScore[],
stream: true,
): Promise<AsyncIterable<EngineResponse>>;
async getResponse(
query: MessageContent,
nodes: NodeWithScore[],
stream: false,
): Promise<EngineResponse>;
async getResponse(
query: MessageContent,
nodes: NodeWithScore[],
@@ -197,6 +207,16 @@ class Refine extends BaseSynthesizer {
* CompactAndRefine is a slight variation of Refine that first compacts the text chunks into the smallest possible number of chunks.
*/
class CompactAndRefine extends Refine {
async getResponse(
query: MessageContent,
nodes: NodeWithScore[],
stream: true,
): Promise<AsyncIterable<EngineResponse>>;
async getResponse(
query: MessageContent,
nodes: NodeWithScore[],
stream: false,
): Promise<EngineResponse>;
async getResponse(
query: MessageContent,
nodes: NodeWithScore[],
@@ -216,17 +236,24 @@ class CompactAndRefine extends Refine {
const newTexts = this.promptHelper.repack(maxPrompt, textChunks);
const newNodes = newTexts.map((text) => new TextNode({ text }));
if (stream) {
return super.getResponse(
const streamResponse = await super.getResponse(
query,
newNodes.map((node) => ({ node })),
true,
);
return streamConverter(streamResponse, (chunk) => {
chunk.sourceNodes = nodes;
return chunk;
});
}
return super.getResponse(
const originalResponse = await super.getResponse(
query,
newNodes.map((node) => ({ node })),
false,
);
originalResponse.sourceNodes = nodes;
return originalResponse;
}
}
@@ -0,0 +1,66 @@
import { describe, expect, test, vi } from "vitest";
import type { LLMMetadata } from "../../llms/dist/index.js";
import { getResponseSynthesizer } from "../../response-synthesizers/dist/index.js";
import { Document } from "../../schema/dist/index.js";
const mockLllm = () => ({
complete: vi.fn().mockImplementation(({ stream }) => {
const response = { text: "unimportant" };
if (!stream) {
return response;
}
function* gen() {
// yield a few times to make sure each chunk has the sourceNodes
yield response;
yield response;
yield response;
}
return gen();
}),
chat: vi.fn(),
metadata: {} as unknown as LLMMetadata,
});
describe("compact and refine response synthesizer", () => {
describe("synthesize", () => {
test("should return original sourceNodes with response when stream = false", async () => {
const synthesizer = getResponseSynthesizer("compact", {
llm: mockLllm(),
});
const sourceNode = { node: new Document({}), score: 1 };
const response = await synthesizer.synthesize(
{
query: "test",
nodes: [sourceNode],
},
false,
);
expect(response.sourceNodes).toEqual([sourceNode]);
});
test("should return original sourceNodes with response when stream = true", async () => {
const synthesizer = getResponseSynthesizer("compact", {
llm: mockLllm(),
});
const sourceNode = { node: new Document({}), score: 1 };
const response = await synthesizer.synthesize(
{
query: "test",
nodes: [sourceNode],
},
true,
);
for await (const chunk of response) {
expect(chunk.sourceNodes).toEqual([sourceNode]);
}
});
});
});
+7
View File
@@ -7,6 +7,13 @@ export {
} from "./shared.js";
export async function loadTransformers(onLoad: OnLoad) {
const nodeVersions = process.versions.node.split(".");
if (nodeVersions[0] && parseInt(nodeVersions[0], 10) < 20) {
throw new Error(
"@huggingface/transformers is not supported on Node.js versions below 20",
);
}
if (getTransformers() === null) {
setTransformers(await import("@huggingface/transformers"));
} else {
+1 -2
View File
@@ -86,7 +86,6 @@
}
},
"devDependencies": {
"@huggingface/transformers": "^3.0.2",
"@swc/cli": "^0.5.0",
"@swc/core": "^1.9.2",
"@vercel/postgres": "^0.10.0",
@@ -98,7 +97,7 @@
"typescript": "^5.6.3"
},
"engines": {
"node": ">=20.0.0"
"node": ">=18.0.0"
},
"types": "./dist/type/index.d.ts",
"main": "./dist/cjs/index.js",
+1 -1
View File
@@ -41,7 +41,7 @@ export default function withLlamaIndex(config: any) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
config.webpack = function (webpackConfig: any, options: any) {
if (userWebpack) {
webpackConfig = userWebpack(webpackConfig);
webpackConfig = userWebpack(webpackConfig, options);
}
webpackConfig.resolve.alias = {
...webpackConfig.resolve.alias,
+1
View File
@@ -1 +1,2 @@
export { VercelLLM } from "./llm";
export { llamaindex } from "./tool";
+183
View File
@@ -0,0 +1,183 @@
import { wrapEventCaller, wrapLLMEvent } from "@llamaindex/core/decorator";
import {
ToolCallLLM,
type ChatMessage,
type ChatResponse,
type ChatResponseChunk,
type LLMChatParamsNonStreaming,
type LLMChatParamsStreaming,
type LLMMetadata,
type ToolCallLLMMessageOptions,
} from "@llamaindex/core/llms";
import { extractText } from "@llamaindex/core/utils";
import {
generateText,
streamText,
type CoreAssistantMessage,
type CoreMessage,
type CoreSystemMessage,
type CoreToolMessage,
type CoreUserMessage,
type ImagePart,
type LanguageModelV1,
type TextPart,
} from "ai";
export type VercelAdditionalChatOptions = ToolCallLLMMessageOptions;
export class VercelLLM extends ToolCallLLM<VercelAdditionalChatOptions> {
supportToolCall: boolean = true;
private model: LanguageModelV1;
constructor({ model }: { model: LanguageModelV1 }) {
super();
this.model = model;
}
get metadata(): LLMMetadata {
return {
model: this.model.modelId,
temperature: 1,
topP: 1,
contextWindow: 128000,
tokenizer: undefined,
};
}
private toVercelMessages(
messages: ChatMessage<ToolCallLLMMessageOptions>[],
): CoreMessage[] {
return messages.map((message) => {
const options = message.options ?? {};
if ("toolResult" in options) {
return {
role: "tool",
content: [
{
type: "tool-result",
toolCallId: options.toolResult.id,
toolName: "", // XXX: tool result doesn't name
isError: options.toolResult.isError,
result: options.toolResult.result,
},
],
} satisfies CoreToolMessage;
} else if ("toolCall" in options) {
return {
role: "assistant",
content: options.toolCall.map((toolCall) => ({
type: "tool-call",
toolName: toolCall.name,
toolCallId: toolCall.id,
args: toolCall.input,
})),
} satisfies CoreAssistantMessage;
}
if (message.role === "system" || message.role === "assistant") {
return {
role: message.role,
content: extractText(message.content),
} satisfies CoreSystemMessage | CoreAssistantMessage;
}
if (message.role === "user") {
return {
role: message.role,
content:
typeof message.content === "string"
? message.content
: message.content.map((contentDetail) => {
if (contentDetail.type === "image_url") {
return {
type: "image",
image: new URL(contentDetail.image_url.url),
} satisfies ImagePart;
}
return {
type: "text",
text: contentDetail.text,
} satisfies TextPart;
}),
} satisfies CoreUserMessage;
}
throw new Error(`Can not convert message ${JSON.stringify(message)}`);
});
}
chat(
params: LLMChatParamsStreaming<
VercelAdditionalChatOptions,
ToolCallLLMMessageOptions
>,
): Promise<AsyncIterable<ChatResponseChunk<ToolCallLLMMessageOptions>>>;
chat(
params: LLMChatParamsNonStreaming<
VercelAdditionalChatOptions,
ToolCallLLMMessageOptions
>,
): Promise<ChatResponse<ToolCallLLMMessageOptions>>;
@wrapEventCaller
@wrapLLMEvent
async chat(
params:
| LLMChatParamsNonStreaming<
VercelAdditionalChatOptions,
ToolCallLLMMessageOptions
>
| LLMChatParamsStreaming<
VercelAdditionalChatOptions,
ToolCallLLMMessageOptions
>,
): Promise<
| ChatResponse<ToolCallLLMMessageOptions>
| AsyncIterable<ChatResponseChunk<ToolCallLLMMessageOptions>>
> {
const { messages, stream } = params;
// Streaming
if (stream) {
const result = streamText({
model: this.model,
messages: this.toVercelMessages(messages),
});
return result.fullStream.pipeThrough(
new TransformStream({
async transform(message, controller): Promise<void> {
switch (message.type) {
case "text-delta":
controller.enqueue({ raw: message, delta: message.textDelta });
}
},
}),
);
}
// Non-streaming
const result = await generateText({
model: this.model,
messages: this.toVercelMessages(messages),
});
return {
raw: result,
message: {
content: result.text,
role: "assistant",
options: result.toolCalls?.length
? {
toolCall: result.toolCalls.map(
({ toolCallId, toolName, args }) => ({
id: toolCallId,
name: toolName,
input: args,
}),
),
}
: {},
},
};
}
}
+20 -13
View File
@@ -1,29 +1,36 @@
import { Settings } from "@llamaindex/core/global";
import type { BaseQueryEngine } from "@llamaindex/core/query-engine";
import { type CoreTool, tool } from "ai";
import { type CoreTool, type LanguageModelV1, tool } from "ai";
import { z } from "zod";
import { VercelLLM } from "./llm";
interface DatasourceIndex {
asQueryEngine: () => BaseQueryEngine;
}
export function llamaindex({
model,
index,
description,
}: {
model: LanguageModelV1;
index: DatasourceIndex;
description?: string;
}): CoreTool {
const queryEngine = index.asQueryEngine();
return tool({
description: description ?? "Get information about your documents.",
parameters: z.object({
query: z
.string()
.describe("The query to get information about your documents."),
}),
execute: async ({ query }) => {
const result = await queryEngine?.query({ query });
return result?.message.content ?? "No result found in documents.";
},
const llm = new VercelLLM({ model });
return Settings.withLLM<CoreTool>(llm, () => {
const queryEngine = index.asQueryEngine();
return tool({
description: description ?? "Get information about your documents.",
parameters: z.object({
query: z
.string()
.describe("The query to get information about your documents."),
}),
execute: async ({ query }) => {
const result = await queryEngine?.query({ query });
return result?.message.content ?? "No result found in documents.";
},
});
});
}
+4
View File
@@ -54,7 +54,11 @@
"build": "bunchee"
},
"devDependencies": {
"@llamaindex/env": "workspace:*",
"@types/node": "^22.9.0",
"bunchee": "5.6.1"
},
"peerDependencies": {
"@llamaindex/env": "workspace:*"
}
}
+2 -1
View File
@@ -1,3 +1,4 @@
import { CustomEvent, randomUUID } from "@llamaindex/env";
import {
type AnyWorkflowEventConstructor,
StartEvent,
@@ -231,7 +232,7 @@ export class WorkflowContext<Start = string, Stop = string, Data = unknown>
#requireEvent = async <T extends AnyWorkflowEventConstructor>(
event: T,
): Promise<InstanceType<T>> => {
const requestId = crypto.randomUUID();
const requestId = randomUUID();
this.#queue.push({
type: "requestEvent",
id: requestId,
+1
View File
@@ -7,6 +7,7 @@
"emitDeclarationOnly": true,
"module": "ESNext",
"moduleResolution": "bundler",
"skipLibCheck": true,
"types": ["node"],
"resolveJsonModule": true
},
+25 -84
View File
@@ -128,7 +128,7 @@ importers:
version: 10.1.0(react@18.3.1)
'@llamaindex/chat-ui':
specifier: 0.0.9
version: 0.0.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
version: 0.0.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@llamaindex/cloud':
specifier: workspace:*
version: link:../../packages/cloud
@@ -173,10 +173,10 @@ importers:
version: 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@vercel/functions':
specifier: ^1.5.0
version: 1.5.0(@aws-sdk/credential-provider-web-identity@3.693.0(@aws-sdk/client-sts@3.693.0))
version: 1.5.0(@aws-sdk/credential-provider-web-identity@3.693.0)
ai:
specifier: ^3.4.33
version: 3.4.33(openai@4.73.1(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.3))(svelte@5.2.3)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8)
version: 3.4.33(openai@4.73.1(zod@3.23.8))(react@18.3.1)(sswr@2.1.0)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8)
class-variance-authority:
specifier: ^0.7.0
version: 0.7.0
@@ -257,7 +257,7 @@ importers:
version: 1.23.1
shiki-magic-move:
specifier: ^0.5.0
version: 0.5.0(react@18.3.1)(shiki@1.23.1)(svelte@5.2.3)(vue@3.5.12(typescript@5.6.3))
version: 0.5.0(react@18.3.1)(shiki@1.23.1)(vue@3.5.12(typescript@5.6.3))
swr:
specifier: ^2.2.5
version: 2.2.5(react@18.3.1)
@@ -1136,9 +1136,6 @@ importers:
specifier: ^3.23.8
version: 3.23.8
devDependencies:
'@huggingface/transformers':
specifier: ^3.0.2
version: 3.0.2
'@swc/cli':
specifier: ^0.5.0
version: 0.5.0(@swc/core@1.9.2(@swc/helpers@0.5.13))(chokidar@3.6.0)
@@ -1480,6 +1477,9 @@ importers:
packages/workflow:
devDependencies:
'@llamaindex/env':
specifier: workspace:*
version: link:../env
'@types/node':
specifier: ^22.9.0
version: 22.9.0
@@ -5910,11 +5910,6 @@ packages:
resolution: {integrity: sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==}
engines: {node: '>=0.4.0'}
acorn-typescript@1.4.13:
resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==}
peerDependencies:
acorn: '>=8.9.0'
acorn-walk@8.3.4:
resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
engines: {node: '>=0.4.0'}
@@ -7561,9 +7556,6 @@ packages:
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
engines: {node: '>=0.10'}
esrap@1.2.2:
resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==}
esrecurse@4.3.0:
resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
engines: {node: '>=4.0'}
@@ -8796,9 +8788,6 @@ packages:
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
is-reference@3.0.3:
resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==}
is-regex@1.1.4:
resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
engines: {node: '>= 0.4'}
@@ -9151,9 +9140,6 @@ packages:
resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
engines: {node: '>= 12.13.0'}
locate-character@3.0.0:
resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
locate-path@3.0.0:
resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
engines: {node: '>=6'}
@@ -12261,10 +12247,6 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
svelte@5.2.3:
resolution: {integrity: sha512-DRrWXdzo6+gfX9H/hQofQYyAtsGqC99+CFBvttImGt6gAy4Xzh0hHBrCHw5OtBgaPOdVGNW+S+mDcYcEsvTPOw==}
engines: {node: '>=18'}
svg-parser@2.0.4:
resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
@@ -13356,9 +13338,6 @@ packages:
youch@3.3.4:
resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==}
zimmerframe@1.1.2:
resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==}
zod-to-json-schema@3.23.5:
resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==}
peerDependencies:
@@ -13454,13 +13433,11 @@ snapshots:
transitivePeerDependencies:
- zod
'@ai-sdk/svelte@0.0.57(svelte@5.2.3)(zod@3.23.8)':
'@ai-sdk/svelte@0.0.57(zod@3.23.8)':
dependencies:
'@ai-sdk/provider-utils': 1.0.22(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.50(zod@3.23.8)
sswr: 2.1.0(svelte@5.2.3)
optionalDependencies:
svelte: 5.2.3
sswr: 2.1.0
transitivePeerDependencies:
- zod
@@ -16806,9 +16783,9 @@ snapshots:
'@leichtgewicht/ip-codec@2.0.5': {}
'@llamaindex/chat-ui@0.0.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
'@llamaindex/chat-ui@0.0.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@llamaindex/pdf-viewer': 1.2.0(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@llamaindex/pdf-viewer': 1.2.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@radix-ui/react-collapsible': 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@radix-ui/react-hover-card': 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@radix-ui/react-icons': 1.3.2(react@18.3.1)
@@ -16836,7 +16813,7 @@ snapshots:
- react-dom
- supports-color
'@llamaindex/pdf-viewer@1.2.0(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
'@llamaindex/pdf-viewer@1.2.0(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@wojtekmaj/react-hooks': 1.17.2(react@18.3.1)
clsx: 2.1.1
@@ -16846,7 +16823,7 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-intersection-observer: 9.5.1(react@18.3.1)
react-pdf: 9.1.1(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-pdf: 9.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-window: 1.8.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
optionalDependencies:
'@types/react': 18.3.12
@@ -18914,7 +18891,7 @@ snapshots:
'@upstash/vector@1.1.7': {}
'@vercel/functions@1.5.0(@aws-sdk/credential-provider-web-identity@3.693.0(@aws-sdk/client-sts@3.693.0))':
'@vercel/functions@1.5.0(@aws-sdk/credential-provider-web-identity@3.693.0)':
optionalDependencies:
'@aws-sdk/credential-provider-web-identity': 3.693.0(@aws-sdk/client-sts@3.693.0)
@@ -19154,10 +19131,6 @@ snapshots:
dependencies:
acorn: 8.14.0
acorn-typescript@1.4.13(acorn@8.14.0):
dependencies:
acorn: 8.14.0
acorn-walk@8.3.4:
dependencies:
acorn: 8.14.0
@@ -19192,13 +19165,13 @@ snapshots:
clean-stack: 2.2.0
indent-string: 4.0.0
ai@3.4.33(openai@4.73.1(encoding@0.1.13)(zod@3.23.8))(react@18.3.1)(sswr@2.1.0(svelte@5.2.3))(svelte@5.2.3)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8):
ai@3.4.33(openai@4.73.1(zod@3.23.8))(react@18.3.1)(sswr@2.1.0)(vue@3.5.12(typescript@5.6.3))(zod@3.23.8):
dependencies:
'@ai-sdk/provider': 0.0.26
'@ai-sdk/provider-utils': 1.0.22(zod@3.23.8)
'@ai-sdk/react': 0.0.70(react@18.3.1)(zod@3.23.8)
'@ai-sdk/solid': 0.0.54(zod@3.23.8)
'@ai-sdk/svelte': 0.0.57(svelte@5.2.3)(zod@3.23.8)
'@ai-sdk/svelte': 0.0.57(zod@3.23.8)
'@ai-sdk/ui-utils': 0.0.50(zod@3.23.8)
'@ai-sdk/vue': 0.0.59(vue@3.5.12(typescript@5.6.3))(zod@3.23.8)
'@opentelemetry/api': 1.9.0
@@ -19210,8 +19183,7 @@ snapshots:
optionalDependencies:
openai: 4.73.1(encoding@0.1.13)(zod@3.23.8)
react: 18.3.1
sswr: 2.1.0(svelte@5.2.3)
svelte: 5.2.3
sswr: 2.1.0
zod: 3.23.8
transitivePeerDependencies:
- solid-js
@@ -20983,7 +20955,7 @@ snapshots:
debug: 4.3.7
enhanced-resolve: 5.17.1
eslint: 9.15.0(jiti@2.4.0)
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.15.0(jiti@2.4.0))
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.15.0(jiti@2.4.0)))(eslint@9.15.0(jiti@2.4.0))
fast-glob: 3.3.2
get-tsconfig: 4.8.1
is-bun-module: 1.2.1
@@ -20996,7 +20968,7 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.15.0(jiti@2.4.0)):
eslint-module-utils@2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.15.0(jiti@2.4.0)))(eslint@9.15.0(jiti@2.4.0)):
dependencies:
debug: 3.2.7
optionalDependencies:
@@ -21018,7 +20990,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.15.0(jiti@2.4.0)
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.15.0(jiti@2.4.0))
eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.15.0(jiti@2.4.0)))(eslint@9.15.0(jiti@2.4.0))
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -21157,11 +21129,6 @@ snapshots:
dependencies:
estraverse: 5.3.0
esrap@1.2.2:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
'@types/estree': 1.0.6
esrecurse@4.3.0:
dependencies:
estraverse: 5.3.0
@@ -22692,10 +22659,6 @@ snapshots:
dependencies:
'@types/estree': 1.0.6
is-reference@3.0.3:
dependencies:
'@types/estree': 1.0.6
is-regex@1.1.4:
dependencies:
call-bind: 1.0.7
@@ -23059,8 +23022,6 @@ snapshots:
loader-utils@3.3.1: {}
locate-character@3.0.0: {}
locate-path@3.0.0:
dependencies:
p-locate: 3.0.0
@@ -24974,7 +24935,7 @@ snapshots:
pathval@2.0.0: {}
pdfjs-dist@4.4.168(encoding@0.1.13):
pdfjs-dist@4.4.168:
optionalDependencies:
canvas: 2.11.2(encoding@0.1.13)
path2d: 0.2.2
@@ -25754,14 +25715,14 @@ snapshots:
prop-types: 15.8.1
react: 18.3.1
react-pdf@9.1.1(@types/react@18.3.12)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
react-pdf@9.1.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
clsx: 2.1.1
dequal: 2.0.3
make-cancellable-promise: 1.3.2
make-event-props: 1.6.2
merge-refs: 1.3.0(@types/react@18.3.12)
pdfjs-dist: 4.4.168(encoding@0.1.13)
pdfjs-dist: 4.4.168
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
tiny-invariant: 1.3.3
@@ -26624,14 +26585,13 @@ snapshots:
interpret: 1.4.0
rechoir: 0.6.2
shiki-magic-move@0.5.0(react@18.3.1)(shiki@1.23.1)(svelte@5.2.3)(vue@3.5.12(typescript@5.6.3)):
shiki-magic-move@0.5.0(react@18.3.1)(shiki@1.23.1)(vue@3.5.12(typescript@5.6.3)):
dependencies:
diff-match-patch-es: 0.1.1
ohash: 1.1.4
optionalDependencies:
react: 18.3.1
shiki: 1.23.1
svelte: 5.2.3
vue: 3.5.12(typescript@5.6.3)
shiki@1.23.1:
@@ -26789,9 +26749,8 @@ snapshots:
srcset@4.0.0: {}
sswr@2.1.0(svelte@5.2.3):
sswr@2.1.0:
dependencies:
svelte: 5.2.3
swrev: 4.0.0
stack-trace@0.0.10: {}
@@ -27021,22 +26980,6 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
svelte@5.2.3:
dependencies:
'@ampproject/remapping': 2.3.0
'@jridgewell/sourcemap-codec': 1.5.0
'@types/estree': 1.0.6
acorn: 8.14.0
acorn-typescript: 1.4.13(acorn@8.14.0)
aria-query: 5.3.2
axobject-query: 4.1.0
esm-env: 1.1.4
esrap: 1.2.2
is-reference: 3.0.3
locate-character: 3.0.0
magic-string: 0.30.12
zimmerframe: 1.1.2
svg-parser@2.0.4: {}
svgo@3.3.2:
@@ -28372,8 +28315,6 @@ snapshots:
mustache: 4.2.0
stacktracey: 2.1.8
zimmerframe@1.1.2: {}
zod-to-json-schema@3.23.5(zod@3.23.8):
dependencies:
zod: 3.23.8