mirror of
https://github.com/run-llama/LlamaIndexTS.git
synced 2026-07-01 22:14:03 -04:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3be87d4670 | |||
| 94da13db0d | |||
| acd50ea99f | |||
| 2967d57ac0 | |||
| a8ec08c682 | |||
| 678b327051 | |||
| 650eeb1df3 | |||
| 50f6747758 | |||
| 12414a6836 | |||
| 856dd8cca8 | |||
| d8f4f6a859 | |||
| f594d7034f |
@@ -1,5 +1,27 @@
|
||||
# @llamaindex/doc
|
||||
|
||||
## 0.2.42
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- a8ec08c: fix: ensure correct message content in agent workflow
|
||||
- Updated dependencies [a8ec08c]
|
||||
- Updated dependencies [2967d57]
|
||||
- @llamaindex/core@0.6.16
|
||||
- @llamaindex/workflow@1.1.16
|
||||
- @llamaindex/cloud@4.0.25
|
||||
- llamaindex@0.11.20
|
||||
- @llamaindex/node-parser@2.0.16
|
||||
- @llamaindex/openai@0.4.11
|
||||
- @llamaindex/readers@3.1.15
|
||||
|
||||
## 0.2.41
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.2.40
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -27,6 +27,33 @@ const config = {
|
||||
destination: "/docs/workflows/:path*",
|
||||
permanent: true,
|
||||
},
|
||||
{
|
||||
source: "/docs/llamaindex/getting_started/installation/node.mdx",
|
||||
destination:
|
||||
"/docs/llamaindex/getting_started/installation/server-apis.mdx",
|
||||
permanent: true,
|
||||
},
|
||||
{
|
||||
source: "/docs/llamaindex/getting_started/installation/typescript.mdx",
|
||||
destination: "/docs/llamaindex/getting_started/installation/index.mdx",
|
||||
permanent: true,
|
||||
},
|
||||
{
|
||||
source: "/docs/llamaindex/getting_started/installation/next.mdx",
|
||||
destination: "/docs/llamaindex/getting_started/installation/nextjs.mdx",
|
||||
permanent: true,
|
||||
},
|
||||
{
|
||||
source: "/docs/llamaindex/getting_started/installation/vite.mdx",
|
||||
destination: "/docs/llamaindex/getting_started/installation/index.mdx",
|
||||
permanent: true,
|
||||
},
|
||||
{
|
||||
source: "/docs/llamaindex/getting_started/installation/cloudflare.mdx",
|
||||
destination:
|
||||
"/docs/llamaindex/getting_started/installation/serverless.mdx",
|
||||
permanent: true,
|
||||
},
|
||||
];
|
||||
},
|
||||
turbopack: {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/doc",
|
||||
"version": "0.2.40",
|
||||
"version": "0.2.42",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"postinstall": "fumadocs-mdx",
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 540 KiB After Width: | Height: | Size: 206 KiB |
@@ -1,6 +1,6 @@
|
||||
import { AIProvider } from "@/actions";
|
||||
import { TooltipProvider } from "@/components/ui/tooltip";
|
||||
import { GoogleAnalytics } from "@next/third-parties/google";
|
||||
import { GoogleAnalytics, GoogleTagManager } from "@next/third-parties/google";
|
||||
import { RootProvider } from "fumadocs-ui/provider";
|
||||
import { Inter } from "next/font/google";
|
||||
import type { ReactNode } from "react";
|
||||
@@ -36,6 +36,7 @@ export default function Layout({ children }: { children: ReactNode }) {
|
||||
LlamaIndex.TS - Build LLM-powered document agents and workflows
|
||||
</title>
|
||||
</head>
|
||||
<GoogleTagManager gtmId="GTM-WWRFB36R" />
|
||||
<body className="flex min-h-screen flex-col">
|
||||
<TooltipProvider>
|
||||
<AIProvider>
|
||||
|
||||
@@ -19,3 +19,8 @@ npm run dev
|
||||
to start the development server. You can then visit [http://localhost:3000](http://localhost:3000) to see your app, which should look something like this:
|
||||
|
||||

|
||||
|
||||
## Learn more
|
||||
|
||||
- [Learn more about `create-llama`](https://github.com/run-llama/create-llama)
|
||||
- [Want to use the same UI components? You can use our React components](https://ui.llamaindex.ai/)
|
||||
|
||||
@@ -17,7 +17,8 @@ npm i
|
||||
Then you can run any example in the folder with `tsx`, e.g.:
|
||||
|
||||
```bash npm2yarn
|
||||
npx tsx ./vectorIndex.ts
|
||||
export OPENAI_API_KEY=your-api-key
|
||||
npx tsx ./agents/agent/openai.ts
|
||||
```
|
||||
|
||||
## Try examples online
|
||||
|
||||
@@ -1,70 +0,0 @@
|
||||
---
|
||||
title: With Cloudflare Worker
|
||||
description: In this guide, you'll learn how to use LlamaIndex with CloudFlare Worker
|
||||
---
|
||||
|
||||
Before you start, make sure you have try LlamaIndex.TS in Node.js to make sure you understand the basics.
|
||||
|
||||
<Card
|
||||
title="Getting Started with LlamaIndex.TS in Node.js"
|
||||
href="/docs/llamaindex/getting_started/installation/node"
|
||||
/>
|
||||
|
||||
Also, you need have the basic understanding of <a href='https://developers.cloudflare.com/workers/'><SiCloudflareworkers className="inline mr-2" color="#F38020" />Cloudflare Worker</a>.
|
||||
|
||||
## Adding environment variables
|
||||
|
||||
```ts
|
||||
export default {
|
||||
async fetch(request: Request, env: Env): Promise<Response> {
|
||||
const { setEnvs } = await import("@llamaindex/env");
|
||||
setEnvs(env);
|
||||
const { OpenAIAgent } = await import("@llamaindex/openai");
|
||||
// Start your code here
|
||||
return new Response("Hello, world!");
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
Then, you need create `.dev.vars` and add LLM api keys for the local development, such as `OPENAI_API_KEY` for OpenAI API key.
|
||||
|
||||
<Callout type="warn">Do not commit the api key to git repository.</Callout>
|
||||
|
||||
## Integrating with Hono
|
||||
|
||||
```ts
|
||||
import { Hono } from "hono";
|
||||
|
||||
type Bindings = {
|
||||
OPENAI_API_KEY: string;
|
||||
};
|
||||
|
||||
const app = new Hono<{
|
||||
Bindings: Bindings;
|
||||
}>();
|
||||
|
||||
app.post("/llm", async (c) => {
|
||||
const { setEnvs } = await import("@llamaindex/env");
|
||||
setEnvs(c.env);
|
||||
|
||||
// ...
|
||||
|
||||
return new Response('Hello, world!');
|
||||
})
|
||||
|
||||
export default {
|
||||
fetch: app.fetch,
|
||||
};
|
||||
```
|
||||
|
||||
## Difference between Node.js and Cloudflare Worker
|
||||
|
||||
In Cloudflare Worker and similar serverless JS environment, you need to be aware of the following differences:
|
||||
|
||||
- Some Node.js modules are not available in Cloudflare Worker, such as `node:fs`, `node:child_process`, `node:cluster`...
|
||||
- You are recommend to design your code using network request, such as use `fetch` API to communicate with database, instead of a long-running process in Node.js.
|
||||
- Some of LlamaIndex.TS packages are not available in Cloudflare Worker, for example `@llamaindex/readers` and `@llamaindex/huggingface`.
|
||||
- The main `llamaindex` is designed to work in all JavaScript environment, including Cloudflare Worker. If you find any issue, please report to us.
|
||||
- `@llamaindex/env` is a JS environment binding module, which polyfill some Node.js/Modern Web API (for example, we have a memory based `fs` module, and Crypto API polyfill). It is designed to work in all JavaScript environment, including Cloudflare Worker.
|
||||
|
||||
|
||||
@@ -1,69 +1,177 @@
|
||||
---
|
||||
title: Installation
|
||||
description: How to install llamaindex packages.
|
||||
description: How to install and set up LlamaIndex.TS for your project.
|
||||
---
|
||||
|
||||
To install llamaindex, run the following command:
|
||||
## Quick Start
|
||||
|
||||
Install the core package:
|
||||
|
||||
```package-install
|
||||
npm i llamaindex
|
||||
```
|
||||
|
||||
In most cases, you'll also need an LLM package and the Workflow package to use LlamaIndex. For example, to use the OpenAI LLM with agents, you would install the following:
|
||||
In most cases, you'll also need an LLM provider and the Workflow package:
|
||||
|
||||
```package-install
|
||||
npm i @llamaindex/openai @llamaindex/workflow
|
||||
```
|
||||
|
||||
Go to [LLM APIs](/docs/llamaindex/modules/models/llms) to find out how to use other LLMs.
|
||||
## Environment Setup
|
||||
|
||||
### API Keys
|
||||
|
||||
## Frameworks
|
||||
Most LLM providers require API keys. Set your OpenAI key (or other provider):
|
||||
|
||||
LlamaIndex supports a wide range of frameworks and runtimes. Click on the card below to learn more.
|
||||
```bash
|
||||
export OPENAI_API_KEY=your-api-key
|
||||
```
|
||||
|
||||
Or use a `.env` file:
|
||||
|
||||
```bash
|
||||
echo "OPENAI_API_KEY=your-api-key" > .env
|
||||
```
|
||||
|
||||
<Callout type="warn">Never commit API keys to your repository.</Callout>
|
||||
|
||||
### Loading Environment Variables
|
||||
|
||||
For Node.js applications:
|
||||
|
||||
```bash
|
||||
node --env-file .env your-script.js
|
||||
```
|
||||
|
||||
For other environments, see the deployment-specific guides below.
|
||||
|
||||
## TypeScript Configuration
|
||||
|
||||
LlamaIndex.TS is built with TypeScript and provides excellent type safety. Add these settings to your `tsconfig.json`:
|
||||
|
||||
```json5
|
||||
{
|
||||
"compilerOptions": {
|
||||
// Essential for module resolution
|
||||
"moduleResolution": "bundler", // or "nodenext" | "node16" | "node"
|
||||
|
||||
// Required for Web Stream API support
|
||||
"lib": ["DOM.AsyncIterable"],
|
||||
|
||||
// Recommended for better compatibility
|
||||
"target": "es2020",
|
||||
"module": "esnext"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Running your first agent
|
||||
|
||||
### Set up
|
||||
|
||||
If you don't already have a project, you can create a new one in a new folder:
|
||||
|
||||
```package-install
|
||||
npm init
|
||||
npm i -D typescript @types/node
|
||||
npm i @llamaindex/openai @llamaindex/workflow llamaindex zod
|
||||
```
|
||||
|
||||
### Run the agent
|
||||
|
||||
Create the file `example.ts`. This code will:
|
||||
|
||||
- Create two tools for use by the agent:
|
||||
- A `sumNumbers` tool that adds two numbers
|
||||
- A `divideNumbers` tool that divides numbers
|
||||
- Give an example of the data structure we wish to generate
|
||||
- Prompt the LLM with instructions and the example, plus a sample transcript
|
||||
|
||||
<include cwd>../../examples/agents/agent/openai.ts</include>
|
||||
|
||||
To run the code:
|
||||
|
||||
```package-install
|
||||
npx tsx example.ts
|
||||
```
|
||||
|
||||
You should expect output something like:
|
||||
|
||||
```
|
||||
{
|
||||
result: '5 + 5 is 10. Then, 10 divided by 2 is 5.',
|
||||
state: {
|
||||
memory: Memory {
|
||||
messages: [Array],
|
||||
tokenLimit: 30000,
|
||||
shortTermTokenLimitRatio: 0.7,
|
||||
memoryBlocks: [],
|
||||
memoryCursor: 0,
|
||||
adapters: [Object]
|
||||
},
|
||||
scratchpad: [],
|
||||
currentAgentName: 'Agent',
|
||||
agents: [ 'Agent' ],
|
||||
nextAgentName: null
|
||||
}
|
||||
}
|
||||
Done
|
||||
```
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Tokenization Speed
|
||||
|
||||
Install `gpt-tokenizer` for 60x faster tokenization (Node.js environments only):
|
||||
|
||||
```package-install
|
||||
npm i gpt-tokenizer
|
||||
```
|
||||
|
||||
LlamaIndex will automatically use this when available.
|
||||
|
||||
## Deployment Guides
|
||||
|
||||
Choose your deployment target:
|
||||
|
||||
<Cards>
|
||||
<Card title={
|
||||
<>
|
||||
<SiNodedotjs className="inline" color="#5FA04E" /> Node.js
|
||||
</>
|
||||
} href="/docs/llamaindex/getting_started/installation/node" />
|
||||
<Card title={
|
||||
<>
|
||||
<SiTypescript className="inline" color="#3178C6" /> TypeScript
|
||||
</>
|
||||
} href="/docs/llamaindex/getting_started/installation/typescript" />
|
||||
<Card title={
|
||||
<>
|
||||
<SiVite className='inline' color='#646CFF' /> Vite
|
||||
</>
|
||||
} href="/docs/llamaindex/getting_started/installation/vite" />
|
||||
<Card
|
||||
title={
|
||||
<>
|
||||
<SiNextdotjs className='inline' /> Next.js (React Server Component)
|
||||
</>
|
||||
}
|
||||
href="/docs/llamaindex/getting_started/installation/next"
|
||||
/>
|
||||
<Card title={
|
||||
<>
|
||||
<SiCloudflareworkers className='inline' color='#F38020' /> Cloudflare Workers
|
||||
</>
|
||||
} href="/docs/llamaindex/getting_started/installation/cloudflare" />
|
||||
<Card
|
||||
title="Server APIs & Backends"
|
||||
description="Express, Fastify, Koa, standalone Node.js servers"
|
||||
href="/docs/llamaindex/getting_started/installation/server-apis"
|
||||
/>
|
||||
<Card
|
||||
title="Serverless Functions"
|
||||
description="Vercel, Netlify, AWS Lambda, Cloudflare Workers"
|
||||
href="/docs/llamaindex/getting_started/installation/serverless"
|
||||
/>
|
||||
<Card
|
||||
title="Next.js Applications"
|
||||
description="API routes, server components, edge runtime"
|
||||
href="/docs/llamaindex/getting_started/installation/nextjs"
|
||||
/>
|
||||
<Card
|
||||
title="Troubleshooting"
|
||||
description="Common issues, bundle optimization, compatibility"
|
||||
href="/docs/llamaindex/getting_started/installation/troubleshooting"
|
||||
/>
|
||||
</Cards>
|
||||
|
||||
## What's next?
|
||||
## LLM/Embedding Providers
|
||||
|
||||
Go to [LLM APIs](/docs/llamaindex/modules/models/llms) and [Embedding APIs](/docs/llamaindex/modules/models/embeddings) to find out how to use different LLM and embedding providers beyond OpenAI.
|
||||
|
||||
## What's Next?
|
||||
|
||||
<Cards>
|
||||
<Card
|
||||
title="Learn LlamaIndex.TS"
|
||||
description="Learn how to use LlamaIndex.TS by starting with one of our tutorials."
|
||||
href="/docs/llamaindex/tutorials/rag"
|
||||
/>
|
||||
<Card
|
||||
title="Show me code examples"
|
||||
description="Explore code examples using LlamaIndex.TS."
|
||||
href="/docs/llamaindex/getting_started/examples"
|
||||
/>
|
||||
<Card
|
||||
title="Learn LlamaIndex.TS"
|
||||
description="Learn how to use LlamaIndex.TS by starting with one of our tutorials."
|
||||
href="/docs/llamaindex/tutorials/basic_agent"
|
||||
/>
|
||||
<Card
|
||||
title="Show me code examples"
|
||||
description="Explore code examples using LlamaIndex.TS."
|
||||
href="/docs/llamaindex/getting_started/examples"
|
||||
/>
|
||||
</Cards>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"title": "Installation",
|
||||
"pages": ["node", "typescript", "next", "vite", "cloudflare"]
|
||||
"pages": ["server-apis", "serverless", "nextjs", "troubleshooting"]
|
||||
}
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
---
|
||||
title: With Next.js
|
||||
description: In this guide, you'll learn how to use LlamaIndex with Next.js.
|
||||
---
|
||||
|
||||
Before you start, make sure you have try LlamaIndex.TS in Node.js to make sure you understand the basics.
|
||||
|
||||
<Card
|
||||
title="Getting Started with LlamaIndex.TS in Node.js"
|
||||
href="/docs/llamaindex/getting_started/installation/node"
|
||||
/>
|
||||
|
||||
## Differences between Node.js and Next.js
|
||||
|
||||
Next.js is a React framework that has both server side compatibility and client side compatibility.
|
||||
This means that you need to be careful when using LlamaIndex.TS in Next.js.
|
||||
Don't leak the import data like API keys to the client side.
|
||||
|
||||
Also, in Next.js, there is build time and runtime. Some computations can be done at build time like Document embedding could be done at build time for better performance.
|
||||
Where as the `llamaindex` package is working with Next.js, some provider packages like `@llamaindex/huggingface` are not working well with Next.js. This is due to the upstream dependencies used by the provider package.
|
||||
|
||||
Make sure to use `withLlamaIndex` to make sure that LlamaIndex.TS works well with Next.js.
|
||||
|
||||
```js
|
||||
// next.config.mjs / next.config.ts
|
||||
import withLlamaIndex from "llamaindex/next";
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {};
|
||||
|
||||
export default withLlamaIndex(nextConfig);
|
||||
```
|
||||
|
||||
If you see any dependency issues, you are welcome to open an issue on the GitHub.
|
||||
|
||||
## Edge Runtime
|
||||
|
||||
[Vercel Edge Runtime](https://edge-runtime.vercel.app/) is a subset of Node.js APIs. Similar to [Cloudflare Workers](/docs/llamaindex/getting_started/installation/cloudflare#difference-between-nodejs-and-cloudflare-worker),
|
||||
it is a serverless platform that runs your code on the edge.
|
||||
|
||||
Not all features of Node.js are supported in Vercel Edge Runtime, so does LlamaIndex.TS, we are working on more compatibility with all JavaScript runtimes.
|
||||
@@ -0,0 +1,375 @@
|
||||
---
|
||||
title: Next.js Applications
|
||||
description: Deploy LlamaIndex.TS in Next.js applications with API routes, server components, and edge runtime.
|
||||
---
|
||||
|
||||
This guide covers integrating LlamaIndex.TS agents with Next.js applications.
|
||||
|
||||
## Essential Configuration
|
||||
|
||||
### Next.js Config
|
||||
|
||||
Use `withLlamaIndex` to ensure compatibility:
|
||||
|
||||
```javascript
|
||||
// next.config.mjs
|
||||
import withLlamaIndex from "llamaindex/next";
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
// Your existing config
|
||||
};
|
||||
|
||||
export default withLlamaIndex(nextConfig);
|
||||
```
|
||||
|
||||
## API Routes
|
||||
|
||||
### App Router (Recommended)
|
||||
|
||||
```typescript
|
||||
// app/api/chat/route.ts
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { tool } from "llamaindex";
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { z } from "zod";
|
||||
import { NextRequest, NextResponse } from "next/server";
|
||||
|
||||
// Initialize agent once (consider using a singleton pattern)
|
||||
let myAgent: any = null;
|
||||
|
||||
async function initializeAgent() {
|
||||
if (myAgent) return myAgent;
|
||||
|
||||
try {
|
||||
const greetTool = tool({
|
||||
name: "greet",
|
||||
description: "Greets a user with their name",
|
||||
parameters: z.object({
|
||||
name: z.string(),
|
||||
}),
|
||||
execute: ({ name }) => `Hello, ${name}! How can I help you today?`,
|
||||
});
|
||||
|
||||
myAgent = agent({
|
||||
tools: [greetTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
|
||||
return myAgent;
|
||||
} catch (error) {
|
||||
console.error("Failed to initialize agent:", error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
try {
|
||||
const { message } = await request.json();
|
||||
|
||||
if (!message || typeof message !== 'string') {
|
||||
return NextResponse.json(
|
||||
{ error: "Message is required and must be a string" },
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
const agent = await initializeAgent();
|
||||
const result = await agent.run(message);
|
||||
|
||||
return NextResponse.json({ response: result.result });
|
||||
} catch (error) {
|
||||
console.error("Chat error:", error);
|
||||
return NextResponse.json(
|
||||
{ error: "Internal server error" },
|
||||
{ status: 500 }
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Pages Router (Legacy)
|
||||
|
||||
```typescript
|
||||
// pages/api/chat.ts
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { tool } from "llamaindex";
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { z } from "zod";
|
||||
import type { NextApiRequest, NextApiResponse } from "next";
|
||||
|
||||
let myAgent: any = null;
|
||||
|
||||
async function initializeAgent() {
|
||||
if (myAgent) return myAgent;
|
||||
|
||||
const timeTool = tool({
|
||||
name: "getCurrentTime",
|
||||
description: "Gets the current time",
|
||||
parameters: z.object({}),
|
||||
execute: () => new Date().toISOString(),
|
||||
});
|
||||
|
||||
myAgent = agent({
|
||||
tools: [timeTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
|
||||
return myAgent;
|
||||
}
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse
|
||||
) {
|
||||
if (req.method !== "POST") {
|
||||
return res.status(405).json({ error: "Method not allowed" });
|
||||
}
|
||||
|
||||
try {
|
||||
const { message } = req.body;
|
||||
|
||||
const agent = await initializeAgent();
|
||||
const result = await agent.run(message);
|
||||
|
||||
res.json({ response: result.result });
|
||||
} catch (error) {
|
||||
console.error("Chat error:", error);
|
||||
res.status(500).json({ error: "Internal server error" });
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Server Components
|
||||
|
||||
Initialize agents in server components:
|
||||
|
||||
```typescript
|
||||
// app/chat/page.tsx
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { tool } from "llamaindex";
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { z } from "zod";
|
||||
|
||||
async function initializeAgent() {
|
||||
const helpTool = tool({
|
||||
name: "getHelp",
|
||||
description: "Provides help information",
|
||||
parameters: z.object({
|
||||
topic: z.string().optional(),
|
||||
}),
|
||||
execute: ({ topic }) => {
|
||||
if (topic) {
|
||||
return `Here's help for ${topic}: This is a helpful resource about ${topic}.`;
|
||||
}
|
||||
return "Available topics: general, troubleshooting, api, deployment";
|
||||
},
|
||||
});
|
||||
|
||||
return agent({
|
||||
tools: [helpTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
}
|
||||
|
||||
export default async function ChatPage() {
|
||||
const chatAgent = await initializeAgent();
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>Chat Interface</h1>
|
||||
<p>Agent initialized and ready to help!</p>
|
||||
{/* Your chat UI components */}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Edge Runtime
|
||||
|
||||
The Edge Runtime has limited Node.js API access:
|
||||
|
||||
```typescript
|
||||
// app/api/chat-edge/route.ts
|
||||
import { NextRequest, NextResponse } from "next/server";
|
||||
|
||||
export const runtime = "edge";
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
const { setEnvs } = await import("@llamaindex/env");
|
||||
setEnvs(process.env);
|
||||
|
||||
try {
|
||||
const { message } = await request.json();
|
||||
|
||||
const { agent } = await import("@llamaindex/workflow");
|
||||
const { tool } = await import("llamaindex");
|
||||
const { openai } = await import("@llamaindex/openai");
|
||||
const { z } = await import("zod");
|
||||
|
||||
const timeTool = tool({
|
||||
name: "time",
|
||||
description: "Gets current time",
|
||||
parameters: z.object({}),
|
||||
execute: () => new Date().toISOString(),
|
||||
});
|
||||
|
||||
const myAgent = agent({
|
||||
tools: [timeTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
|
||||
const result = await myAgent.run(message);
|
||||
return NextResponse.json({ response: result.result });
|
||||
} catch (error) {
|
||||
return NextResponse.json({ error: error.message }, { status: 500 });
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Streaming Responses
|
||||
|
||||
Implement streaming for better user experience:
|
||||
|
||||
```typescript
|
||||
// app/api/chat-stream/route.ts
|
||||
import { agentStreamEvent } from "@llamaindex/workflow";
|
||||
import { NextRequest } from "next/server";
|
||||
|
||||
// Assume myAgent is initialized elsewhere
|
||||
declare const myAgent: any;
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
const { message } = await request.json();
|
||||
|
||||
const stream = new ReadableStream({
|
||||
async start(controller) {
|
||||
try {
|
||||
const context = myAgent.runStream(message);
|
||||
|
||||
for await (const event of context) {
|
||||
if (agentStreamEvent.include(event)) {
|
||||
controller.enqueue(new TextEncoder().encode(event.data.delta));
|
||||
}
|
||||
}
|
||||
|
||||
controller.close();
|
||||
} catch (error) {
|
||||
controller.error(error);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
return new Response(stream, {
|
||||
headers: {
|
||||
"Content-Type": "text/plain",
|
||||
"Transfer-Encoding": "chunked",
|
||||
},
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
## Client-side Integration
|
||||
|
||||
### React Hook for API Calls
|
||||
|
||||
```typescript
|
||||
// hooks/useAgentChat.ts
|
||||
import { useState } from "react";
|
||||
|
||||
export function useAgentChat() {
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [response, setResponse] = useState<string | null>(null);
|
||||
|
||||
const chat = async (message: string) => {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
|
||||
try {
|
||||
const res = await fetch("/api/chat", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ message }),
|
||||
});
|
||||
|
||||
if (!res.ok) {
|
||||
throw new Error(`HTTP error! status: ${res.status}`);
|
||||
}
|
||||
|
||||
const data = await res.json();
|
||||
setResponse(data.response);
|
||||
} catch (err) {
|
||||
setError(err instanceof Error ? err.message : "An error occurred");
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
return { chat, loading, error, response };
|
||||
}
|
||||
```
|
||||
|
||||
### Chat Component
|
||||
|
||||
```typescript
|
||||
// components/ChatInterface.tsx
|
||||
"use client";
|
||||
|
||||
import { useState } from "react";
|
||||
import { useAgentChat } from "@/hooks/useAgentChat";
|
||||
|
||||
export default function ChatInterface() {
|
||||
const [message, setMessage] = useState("");
|
||||
const { chat, loading, error, response } = useAgentChat();
|
||||
|
||||
const handleSubmit = async (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
if (!message.trim()) return;
|
||||
|
||||
await chat(message);
|
||||
setMessage("");
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="max-w-2xl mx-auto p-4">
|
||||
<form onSubmit={handleSubmit} className="mb-4">
|
||||
<input
|
||||
type="text"
|
||||
value={message}
|
||||
onChange={(e) => setMessage(e.target.value)}
|
||||
placeholder="Send a message..."
|
||||
className="w-full p-2 border rounded"
|
||||
disabled={loading}
|
||||
/>
|
||||
<button
|
||||
type="submit"
|
||||
disabled={loading || !message.trim()}
|
||||
className="mt-2 px-4 py-2 bg-blue-500 text-white rounded disabled:opacity-50"
|
||||
>
|
||||
{loading ? "Thinking..." : "Send"}
|
||||
</button>
|
||||
</form>
|
||||
|
||||
{error && (
|
||||
<div className="p-3 mb-4 bg-red-100 border border-red-400 text-red-700 rounded">
|
||||
Error: {error}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{response && (
|
||||
<div className="p-3 bg-gray-100 border rounded">
|
||||
<strong>Agent:</strong>
|
||||
<p>{response}</p>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
- Learn about [serverless deployment](/docs/llamaindex/getting_started/installation/serverless)
|
||||
- Explore [server APIs](/docs/llamaindex/getting_started/installation/server-apis)
|
||||
- Check [troubleshooting guide](/docs/llamaindex/getting_started/installation/troubleshooting) for common issues
|
||||
@@ -1,40 +0,0 @@
|
||||
---
|
||||
title: With Node.js/Bun/Deno
|
||||
description: In this guide, you'll learn how to use LlamaIndex with Node.js, Bun, and Deno.
|
||||
---
|
||||
|
||||
## Adding environment variables
|
||||
|
||||
By default, LlamaIndex uses OpenAI provider, which requires an API key. You can set the `OPENAI_API_KEY` environment variable to authenticate with OpenAI.
|
||||
|
||||
```shell
|
||||
export OPENAI_API_KEY=your-api-key
|
||||
```
|
||||
|
||||
Or you can use a `.env` file:
|
||||
|
||||
```shell
|
||||
echo "OPENAI_API_KEY=your-api-key" > .env
|
||||
node --env-file .env your-script.js
|
||||
```
|
||||
|
||||
<Callout type="warn">Do not commit the api key to git repository.</Callout>
|
||||
|
||||
For more information, see the [How to read environment variables from Node.js](https://nodejs.org/en/learn/command-line/how-to-read-environment-variables-from-nodejs).
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
By the default, we are using `js-tiktoken` for tokenization. You can install `gpt-tokenizer` which is then automatically used by LlamaIndex to get a 60x speedup for tokenization:
|
||||
|
||||
```package-install
|
||||
npm i gpt-tokenizer
|
||||
```
|
||||
|
||||
**Note**: This only works for Node.js
|
||||
|
||||
## TypeScript support
|
||||
|
||||
<Card
|
||||
title="Getting Started with LlamaIndex.TS in TypeScript"
|
||||
href="/docs/llamaindex/getting_started/installation/typescript"
|
||||
/>
|
||||
@@ -0,0 +1,211 @@
|
||||
---
|
||||
title: Server APIs & Backends
|
||||
description: Deploy LlamaIndex.TS in server environments like Express, Fastify, and standalone Node.js applications.
|
||||
---
|
||||
|
||||
This guide covers adding LlamaIndex.TS agents to traditional server environments where you have full Node.js runtime access.
|
||||
|
||||
## Supported Runtimes
|
||||
|
||||
LlamaIndex.TS works seamlessly with:
|
||||
|
||||
- **Node.js** (v18+)
|
||||
- **Bun** (v1.0+)
|
||||
- **Deno** (v1.30+)
|
||||
|
||||
## Common Server Frameworks
|
||||
|
||||
### Express.js
|
||||
|
||||
```typescript
|
||||
import express from 'express';
|
||||
import { agent } from '@llamaindex/workflow';
|
||||
import { tool } from 'llamaindex';
|
||||
import { openai } from '@llamaindex/openai';
|
||||
import { z } from 'zod';
|
||||
|
||||
const app = express();
|
||||
app.use(express.json());
|
||||
|
||||
// Initialize agent once at startup
|
||||
let myAgent: any;
|
||||
|
||||
async function initializeAgent() {
|
||||
// Create tools for the agent
|
||||
const sumTool = tool({
|
||||
name: "sum",
|
||||
description: "Adds two numbers",
|
||||
parameters: z.object({
|
||||
a: z.number(),
|
||||
b: z.number(),
|
||||
}),
|
||||
execute: ({ a, b }) => a + b,
|
||||
});
|
||||
|
||||
const multiplyTool = tool({
|
||||
name: "multiply",
|
||||
description: "Multiplies two numbers",
|
||||
parameters: z.object({
|
||||
a: z.number(),
|
||||
b: z.number(),
|
||||
}),
|
||||
execute: ({ a, b }) => a * b,
|
||||
});
|
||||
|
||||
// Create the agent
|
||||
myAgent = agent({
|
||||
tools: [sumTool, multiplyTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
}
|
||||
|
||||
app.post('/api/chat', async (req, res) => {
|
||||
try {
|
||||
const { message } = req.body;
|
||||
const result = await myAgent.run(message);
|
||||
res.json({ response: result.result });
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: 'Chat failed' });
|
||||
}
|
||||
});
|
||||
|
||||
// Initialize and start server
|
||||
initializeAgent().then(() => {
|
||||
app.listen(3000, () => {
|
||||
console.log('Server running on port 3000');
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### Fastify
|
||||
|
||||
```typescript
|
||||
import Fastify from 'fastify';
|
||||
import { agent } from '@llamaindex/workflow';
|
||||
import { tool } from 'llamaindex';
|
||||
import { openai } from '@llamaindex/openai';
|
||||
import { z } from 'zod';
|
||||
|
||||
const fastify = Fastify();
|
||||
let myAgent: any;
|
||||
|
||||
async function initializeAgent() {
|
||||
const sumTool = tool({
|
||||
name: "sum",
|
||||
description: "Adds two numbers",
|
||||
parameters: z.object({
|
||||
a: z.number(),
|
||||
b: z.number(),
|
||||
}),
|
||||
execute: ({ a, b }) => a + b,
|
||||
});
|
||||
|
||||
myAgent = agent({
|
||||
tools: [sumTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
}
|
||||
|
||||
fastify.post('/api/chat', async (request, reply) => {
|
||||
try {
|
||||
const { message } = request.body as { message: string };
|
||||
const result = await myAgent.run(message);
|
||||
return { response: result.result };
|
||||
} catch (error) {
|
||||
reply.status(500).send({ error: 'Chat failed' });
|
||||
}
|
||||
});
|
||||
|
||||
const start = async () => {
|
||||
await initializeAgent();
|
||||
await fastify.listen({ port: 3000 });
|
||||
console.log('Server running on port 3000');
|
||||
};
|
||||
|
||||
start();
|
||||
```
|
||||
|
||||
### Hono
|
||||
|
||||
```typescript
|
||||
import { Hono } from "hono";
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { tool } from "llamaindex";
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { z } from "zod";
|
||||
|
||||
type Bindings = {
|
||||
OPENAI_API_KEY: string;
|
||||
};
|
||||
|
||||
const app = new Hono<{ Bindings: Bindings }>();
|
||||
|
||||
app.post("/api/chat", async (c) => {
|
||||
const { setEnvs } = await import("@llamaindex/env");
|
||||
setEnvs(c.env);
|
||||
|
||||
const { message } = await c.req.json();
|
||||
|
||||
const greetTool = tool({
|
||||
name: "greet",
|
||||
description: "Greets a user",
|
||||
parameters: z.object({
|
||||
name: z.string(),
|
||||
}),
|
||||
execute: ({ name }) => `Hello, ${name}!`,
|
||||
});
|
||||
|
||||
const myAgent = agent({
|
||||
tools: [greetTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
|
||||
try {
|
||||
const result = await myAgent.run(message);
|
||||
return c.json({ response: result.result });
|
||||
} catch (error) {
|
||||
return c.json({ error: error.message }, 500);
|
||||
}
|
||||
});
|
||||
|
||||
export default app;
|
||||
```
|
||||
|
||||
## Streaming Responses
|
||||
|
||||
For real-time agent responses:
|
||||
|
||||
```typescript
|
||||
import { agentStreamEvent } from "@llamaindex/workflow";
|
||||
|
||||
app.post('/api/chat-stream', async (req, res) => {
|
||||
const { message } = req.body;
|
||||
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'text/plain',
|
||||
'Transfer-Encoding': 'chunked',
|
||||
});
|
||||
|
||||
try {
|
||||
const context = myAgent.runStream(message);
|
||||
|
||||
for await (const event of context) {
|
||||
if (agentStreamEvent.include(event)) {
|
||||
res.write(event.data.delta);
|
||||
}
|
||||
}
|
||||
|
||||
res.end();
|
||||
} catch (error) {
|
||||
res.write('Error: ' + error.message);
|
||||
res.end();
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
|
||||
## Next Steps
|
||||
|
||||
- Learn about [serverless deployment](/docs/llamaindex/getting_started/installation/serverless)
|
||||
- Explore [Next.js integration](/docs/llamaindex/getting_started/installation/nextjs)
|
||||
- Check [troubleshooting guide](/docs/llamaindex/getting_started/installation/troubleshooting) for common issues
|
||||
@@ -0,0 +1,240 @@
|
||||
---
|
||||
title: Serverless Functions
|
||||
description: Deploy LlamaIndex.TS in serverless environments like Vercel, Netlify, AWS Lambda, and Cloudflare Workers.
|
||||
---
|
||||
|
||||
This guide covers adding LlamaIndex.TS agents to serverless environments where you have execution time and memory constraints.
|
||||
|
||||
## Cloudflare Workers
|
||||
|
||||
```typescript
|
||||
export default {
|
||||
async fetch(request: Request, env: Env): Promise<Response> {
|
||||
const { setEnvs } = await import("@llamaindex/env");
|
||||
setEnvs(env);
|
||||
|
||||
const { agent } = await import("@llamaindex/workflow");
|
||||
const { openai } = await import("@llamaindex/openai");
|
||||
const { tool } = await import("llamaindex");
|
||||
const { z } = await import("zod");
|
||||
|
||||
const timeTool = tool({
|
||||
name: "getCurrentTime",
|
||||
description: "Gets the current time",
|
||||
parameters: z.object({}),
|
||||
execute: () => new Date().toISOString(),
|
||||
});
|
||||
|
||||
const myAgent = agent({
|
||||
tools: [timeTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
|
||||
try {
|
||||
const { message } = await request.json();
|
||||
const result = await myAgent.run(message);
|
||||
|
||||
return new Response(JSON.stringify({ response: result.result }), {
|
||||
headers: { "Content-Type": "application/json" },
|
||||
});
|
||||
} catch (error) {
|
||||
return new Response(JSON.stringify({ error: error.message }), {
|
||||
status: 500,
|
||||
headers: { "Content-Type": "application/json" },
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Vercel Functions
|
||||
|
||||
### Node.js Runtime
|
||||
|
||||
```typescript
|
||||
// pages/api/chat.ts or app/api/chat/route.ts
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { tool } from "llamaindex";
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { z } from "zod";
|
||||
|
||||
export default async function handler(req, res) {
|
||||
if (req.method !== 'POST') {
|
||||
return res.status(405).json({ error: 'Method not allowed' });
|
||||
}
|
||||
|
||||
const { message } = req.body;
|
||||
|
||||
const weatherTool = tool({
|
||||
name: "getWeather",
|
||||
description: "Get weather information",
|
||||
parameters: z.object({
|
||||
city: z.string(),
|
||||
}),
|
||||
execute: ({ city }) => `Weather in ${city}: 72°F, sunny`,
|
||||
});
|
||||
|
||||
const myAgent = agent({
|
||||
tools: [weatherTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
|
||||
try {
|
||||
const result = await myAgent.run(message);
|
||||
res.json({ response: result.result });
|
||||
} catch (error) {
|
||||
res.status(500).json({ error: error.message });
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Edge Runtime
|
||||
|
||||
```typescript
|
||||
// app/api/chat/route.ts
|
||||
import { NextRequest, NextResponse } from "next/server";
|
||||
|
||||
export const runtime = "edge";
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
const { setEnvs } = await import("@llamaindex/env");
|
||||
setEnvs(process.env);
|
||||
|
||||
const { message } = await request.json();
|
||||
|
||||
try {
|
||||
// Use simpler tools for edge runtime
|
||||
const { agent } = await import("@llamaindex/workflow");
|
||||
const { tool } = await import("llamaindex");
|
||||
const { openai } = await import("@llamaindex/openai");
|
||||
const { z } = await import("zod");
|
||||
|
||||
const timeTool = tool({
|
||||
name: "time",
|
||||
description: "Gets current time",
|
||||
parameters: z.object({}),
|
||||
execute: () => new Date().toISOString(),
|
||||
});
|
||||
|
||||
const myAgent = agent({
|
||||
tools: [timeTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
|
||||
const result = await myAgent.run(message);
|
||||
return NextResponse.json({ response: result.result });
|
||||
} catch (error) {
|
||||
return NextResponse.json({ error: error.message }, { status: 500 });
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## AWS Lambda
|
||||
|
||||
```typescript
|
||||
import { APIGatewayProxyHandler } from "aws-lambda";
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { tool } from "llamaindex";
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { z } from "zod";
|
||||
|
||||
export const handler: APIGatewayProxyHandler = async (event, context) => {
|
||||
const { message } = JSON.parse(event.body || "{}");
|
||||
|
||||
const calculatorTool = tool({
|
||||
name: "calculate",
|
||||
description: "Performs basic math",
|
||||
parameters: z.object({
|
||||
expression: z.string(),
|
||||
}),
|
||||
execute: ({ expression }) => {
|
||||
// Simple calculator implementation
|
||||
try {
|
||||
return `Result: ${eval(expression)}`;
|
||||
} catch {
|
||||
return "Invalid expression";
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const myAgent = agent({
|
||||
tools: [calculatorTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
|
||||
try {
|
||||
const result = await myAgent.run(message);
|
||||
|
||||
return {
|
||||
statusCode: 200,
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
"Access-Control-Allow-Origin": "*",
|
||||
},
|
||||
body: JSON.stringify({ response: result.result }),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
statusCode: 500,
|
||||
body: JSON.stringify({ error: error.message }),
|
||||
};
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## Netlify Functions
|
||||
|
||||
```typescript
|
||||
// netlify/functions/chat.ts
|
||||
import { Handler } from "@netlify/functions";
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { tool } from "llamaindex";
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { z } from "zod";
|
||||
|
||||
export const handler: Handler = async (event, context) => {
|
||||
if (event.httpMethod !== "POST") {
|
||||
return { statusCode: 405, body: "Method Not Allowed" };
|
||||
}
|
||||
|
||||
const { message } = JSON.parse(event.body || "{}");
|
||||
|
||||
const helpTool = tool({
|
||||
name: "help",
|
||||
description: "Provides help information",
|
||||
parameters: z.object({
|
||||
topic: z.string().optional(),
|
||||
}),
|
||||
execute: ({ topic }) => {
|
||||
return topic ? `Help for ${topic}` : "Available help topics";
|
||||
},
|
||||
});
|
||||
|
||||
const myAgent = agent({
|
||||
tools: [helpTool],
|
||||
llm: openai({ model: "gpt-4o-mini" }),
|
||||
});
|
||||
|
||||
try {
|
||||
const result = await myAgent.run(message);
|
||||
|
||||
return {
|
||||
statusCode: 200,
|
||||
body: JSON.stringify({ response: result.result }),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
statusCode: 500,
|
||||
body: JSON.stringify({ error: error.message }),
|
||||
};
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
- Learn about [Next.js integration](/docs/llamaindex/getting_started/installation/nextjs)
|
||||
- Explore [server deployment](/docs/llamaindex/getting_started/installation/server-apis)
|
||||
- Check [troubleshooting guide](/docs/llamaindex/getting_started/installation/troubleshooting) for common issues
|
||||
+501
@@ -0,0 +1,501 @@
|
||||
---
|
||||
title: Troubleshooting
|
||||
description: Common issues and solutions when installing and deploying LlamaIndex.TS applications.
|
||||
---
|
||||
|
||||
This guide addresses common issues you might encounter when installing and deploying LlamaIndex.TS applications across different environments.
|
||||
|
||||
## Installation Issues
|
||||
|
||||
### Module Resolution Errors
|
||||
|
||||
**Problem:** Import errors or module not found errors
|
||||
|
||||
**Solution:** Ensure your `tsconfig.json` is properly configured:
|
||||
|
||||
```json5
|
||||
{
|
||||
"compilerOptions": {
|
||||
"moduleResolution": "bundler", // or "nodenext" | "node16" | "node"
|
||||
"lib": ["DOM.AsyncIterable"],
|
||||
"target": "es2020",
|
||||
"module": "esnext"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Alternative solution:** Try different module resolution strategies:
|
||||
|
||||
```bash
|
||||
# Clear node_modules and reinstall
|
||||
rm -rf node_modules package-lock.json
|
||||
npm install
|
||||
|
||||
# Or try with different package manager
|
||||
pnpm install
|
||||
# or
|
||||
yarn install
|
||||
```
|
||||
|
||||
### TypeScript Errors
|
||||
|
||||
**Problem:** TypeScript compilation errors with LlamaIndex imports
|
||||
|
||||
**Solution:** Ensure you have the correct TypeScript configuration:
|
||||
|
||||
```json5
|
||||
{
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"skipLibCheck": true, // Skip type checking of node_modules
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"esModuleInterop": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Package Compatibility Issues
|
||||
|
||||
**Problem:** Some packages don't work in certain environments
|
||||
|
||||
**Common incompatibilities:**
|
||||
- `@llamaindex/readers` - May not work in serverless environments
|
||||
- `@llamaindex/huggingface` - Limited browser/edge compatibility
|
||||
- File system readers - Don't work in browser/edge environments
|
||||
|
||||
**Solution:** Use environment-specific alternatives:
|
||||
|
||||
```typescript
|
||||
// Instead of file system readers in serverless
|
||||
// Use remote data sources
|
||||
async function loadDocumentsFromAPI() {
|
||||
const response = await fetch('https://api.example.com/documents');
|
||||
const data = await response.json();
|
||||
return data.map(doc => new Document(doc.content));
|
||||
}
|
||||
```
|
||||
|
||||
## Runtime Issues
|
||||
|
||||
### Memory Errors
|
||||
|
||||
**Problem:** Out of memory errors during index creation or querying
|
||||
|
||||
**Solution:** Optimize memory usage:
|
||||
|
||||
```typescript
|
||||
// Batch process large document sets
|
||||
async function batchProcessDocuments(documents: Document[], batchSize = 10) {
|
||||
const results = [];
|
||||
|
||||
for (let i = 0; i < documents.length; i += batchSize) {
|
||||
const batch = documents.slice(i, i + batchSize);
|
||||
const batchIndex = await VectorStoreIndex.fromDocuments(batch);
|
||||
results.push(batchIndex);
|
||||
|
||||
// Optional: Add delay between batches
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
```
|
||||
|
||||
**For serverless environments:**
|
||||
|
||||
```typescript
|
||||
// Use external vector stores instead of in-memory
|
||||
// TODO: Example with Pinecone, Weaviate, etc.
|
||||
// const vectorStore = new PineconeVectorStore(/* config */);
|
||||
// const index = await VectorStoreIndex.fromVectorStore(vectorStore);
|
||||
```
|
||||
|
||||
### API Rate Limiting
|
||||
|
||||
**Problem:** Rate limiting errors from LLM providers
|
||||
|
||||
**Solution:** Implement retry logic with exponential backoff:
|
||||
|
||||
```typescript
|
||||
async function queryWithRetry(queryEngine: any, question: string, maxRetries = 3) {
|
||||
for (let i = 0; i < maxRetries; i++) {
|
||||
try {
|
||||
return await queryEngine.query(question);
|
||||
} catch (error) {
|
||||
if (error.message.includes('rate limit') && i < maxRetries - 1) {
|
||||
const delay = Math.pow(2, i) * 1000; // Exponential backoff
|
||||
await new Promise(resolve => setTimeout(resolve, delay));
|
||||
continue;
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Tokenization Performance
|
||||
|
||||
**Problem:** Slow tokenization affecting performance
|
||||
|
||||
**Solution:** Install faster tokenizer (Node.js only):
|
||||
|
||||
```bash
|
||||
npm install gpt-tokenizer
|
||||
```
|
||||
|
||||
LlamaIndex will automatically use this for 60x faster tokenization.
|
||||
|
||||
## Bundling Issues
|
||||
|
||||
### Bundle Size Too Large
|
||||
|
||||
**Problem:** Large bundle sizes affecting performance
|
||||
|
||||
**Solution:** Use dynamic imports and code splitting:
|
||||
|
||||
```typescript
|
||||
// Lazy load LlamaIndex components
|
||||
const initializeLlamaIndex = async () => {
|
||||
const { VectorStoreIndex, SimpleDirectoryReader } = await import("llamaindex");
|
||||
return { VectorStoreIndex, SimpleDirectoryReader };
|
||||
};
|
||||
|
||||
// In your API route
|
||||
export async function POST(request: NextRequest) {
|
||||
const { VectorStoreIndex, SimpleDirectoryReader } = await initializeLlamaIndex();
|
||||
// Use the imported modules
|
||||
}
|
||||
```
|
||||
|
||||
### Webpack/Vite Bundling Issues
|
||||
|
||||
**Problem:** Bundler compatibility issues
|
||||
|
||||
**Solution for Next.js:**
|
||||
|
||||
```javascript
|
||||
// next.config.mjs
|
||||
import withLlamaIndex from "llamaindex/next";
|
||||
|
||||
const nextConfig = {
|
||||
webpack: (config, { isServer }) => {
|
||||
// Custom webpack configuration if needed
|
||||
if (!isServer) {
|
||||
config.resolve.fallback = {
|
||||
...config.resolve.fallback,
|
||||
fs: false,
|
||||
net: false,
|
||||
tls: false,
|
||||
};
|
||||
}
|
||||
return config;
|
||||
},
|
||||
};
|
||||
|
||||
export default withLlamaIndex(nextConfig);
|
||||
```
|
||||
|
||||
**Solution for Vite:**
|
||||
|
||||
```typescript
|
||||
// vite.config.ts
|
||||
import { defineConfig } from 'vite';
|
||||
|
||||
export default defineConfig({
|
||||
define: {
|
||||
global: 'globalThis',
|
||||
},
|
||||
resolve: {
|
||||
alias: {
|
||||
// Add aliases for problematic modules
|
||||
},
|
||||
},
|
||||
optimizeDeps: {
|
||||
include: ['llamaindex'],
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
## Environment-Specific Issues
|
||||
|
||||
### Node.js Version Compatibility
|
||||
|
||||
**Problem:** Node.js version compatibility issues
|
||||
|
||||
**Solution:** Use supported Node.js versions:
|
||||
|
||||
```json
|
||||
{
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Check your Node.js version:**
|
||||
|
||||
```bash
|
||||
node --version
|
||||
```
|
||||
|
||||
### Cloudflare Workers Issues
|
||||
|
||||
**Problem:** Module not available in Cloudflare Workers
|
||||
|
||||
**Solution:** Use `@llamaindex/env` for environment compatibility:
|
||||
|
||||
```typescript
|
||||
export default {
|
||||
async fetch(request: Request, env: Env): Promise<Response> {
|
||||
const { setEnvs } = await import("@llamaindex/env");
|
||||
setEnvs(env);
|
||||
|
||||
// Your LlamaIndex code here
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
### Vercel Edge Runtime Issues
|
||||
|
||||
**Problem:** Limited Node.js API access in Edge Runtime
|
||||
|
||||
**Solution:** Use standard runtime or adapt code:
|
||||
|
||||
```typescript
|
||||
// Force standard runtime
|
||||
export const runtime = "nodejs";
|
||||
|
||||
// Or adapt for edge
|
||||
export const runtime = "edge";
|
||||
|
||||
export async function POST(request: NextRequest) {
|
||||
// Use edge-compatible code only
|
||||
const { setEnvs } = await import("@llamaindex/env");
|
||||
setEnvs(process.env);
|
||||
|
||||
// Avoid file system operations
|
||||
// Use remote data sources
|
||||
}
|
||||
```
|
||||
|
||||
## Performance Issues
|
||||
|
||||
### Slow Query Responses
|
||||
|
||||
**Problem:** Slow query performance
|
||||
|
||||
**Solution:** Implement caching and optimization:
|
||||
|
||||
```typescript
|
||||
import { LRUCache } from 'lru-cache';
|
||||
|
||||
const queryCache = new LRUCache<string, string>({
|
||||
max: 100,
|
||||
ttl: 1000 * 60 * 10, // 10 minutes
|
||||
});
|
||||
|
||||
export async function optimizedQuery(question: string, queryEngine: any) {
|
||||
// Check cache first
|
||||
const cached = queryCache.get(question);
|
||||
if (cached) return cached;
|
||||
|
||||
// Query and cache result
|
||||
const result = await queryEngine.query(question);
|
||||
queryCache.set(question, result);
|
||||
|
||||
return result;
|
||||
}
|
||||
```
|
||||
|
||||
### Cold Start Issues
|
||||
|
||||
**Problem:** Slow cold starts in serverless environments
|
||||
|
||||
**Solution:** Pre-warm your functions:
|
||||
|
||||
```typescript
|
||||
// Pre-initialize outside handler
|
||||
let cachedQueryEngine: any = null;
|
||||
|
||||
export async function handler(event: any) {
|
||||
if (!cachedQueryEngine) {
|
||||
cachedQueryEngine = await initializeQueryEngine();
|
||||
}
|
||||
|
||||
// Use cached engine
|
||||
return await cachedQueryEngine.query(question);
|
||||
}
|
||||
```
|
||||
|
||||
## Environment Variable Issues
|
||||
|
||||
### Missing API Keys
|
||||
|
||||
**Problem:** API key not found or invalid
|
||||
|
||||
**Solution:** Verify environment variable setup:
|
||||
|
||||
```typescript
|
||||
// Check if API key is available
|
||||
if (!process.env.OPENAI_API_KEY) {
|
||||
throw new Error('OPENAI_API_KEY environment variable is required');
|
||||
}
|
||||
|
||||
// For debugging (remove in production)
|
||||
console.log('API Key present:', !!process.env.OPENAI_API_KEY);
|
||||
```
|
||||
|
||||
### Environment Variable Loading
|
||||
|
||||
**Problem:** Environment variables not loading correctly
|
||||
|
||||
**Solution:** Use proper loading mechanisms:
|
||||
|
||||
```typescript
|
||||
// For Node.js
|
||||
import 'dotenv/config';
|
||||
|
||||
// For Next.js - use .env.local
|
||||
// Variables are automatically loaded
|
||||
|
||||
// For Cloudflare Workers
|
||||
export default {
|
||||
async fetch(request: Request, env: Env): Promise<Response> {
|
||||
// Use env parameter, not process.env
|
||||
const apiKey = env.OPENAI_API_KEY;
|
||||
// ...
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
## Common Error Messages
|
||||
|
||||
### "Cannot find module 'llamaindex'"
|
||||
|
||||
**Cause:** Package not installed or module resolution issue
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
npm install llamaindex
|
||||
```
|
||||
|
||||
### "Module not found: Can't resolve 'fs'"
|
||||
|
||||
**Cause:** File system modules used in browser/edge environment
|
||||
|
||||
**Solution:**
|
||||
```typescript
|
||||
// Use dynamic imports with fallbacks
|
||||
const loadDocuments = async () => {
|
||||
if (typeof window !== 'undefined') {
|
||||
// Browser environment - use alternative
|
||||
return await loadDocumentsFromAPI();
|
||||
} else {
|
||||
// Node.js environment - use file system
|
||||
const { SimpleDirectoryReader } = await import('llamaindex');
|
||||
return await new SimpleDirectoryReader('data').loadData();
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### "ReferenceError: global is not defined"
|
||||
|
||||
**Cause:** Global polyfill missing in browser environments
|
||||
|
||||
**Solution:**
|
||||
```typescript
|
||||
// Add to your app entry point
|
||||
if (typeof global === 'undefined') {
|
||||
global = globalThis;
|
||||
}
|
||||
```
|
||||
|
||||
### "Cannot read properties of undefined (reading 'query')"
|
||||
|
||||
**Cause:** Query engine not properly initialized
|
||||
|
||||
**Solution:**
|
||||
```typescript
|
||||
// Always check initialization
|
||||
if (!queryEngine) {
|
||||
throw new Error('Query engine not initialized');
|
||||
}
|
||||
|
||||
// Or use optional chaining
|
||||
const response = await queryEngine?.query(question);
|
||||
```
|
||||
|
||||
## Debugging Tips
|
||||
|
||||
### Enable Debug Logging
|
||||
|
||||
```typescript
|
||||
// Enable debug logging
|
||||
process.env.DEBUG = "llamaindex:*";
|
||||
|
||||
// Or specific modules
|
||||
process.env.DEBUG = "llamaindex:vector-store";
|
||||
```
|
||||
|
||||
### Check Package Versions
|
||||
|
||||
```bash
|
||||
npm list llamaindex
|
||||
npm list @llamaindex/openai
|
||||
```
|
||||
|
||||
### Test in Isolation
|
||||
|
||||
```typescript
|
||||
// Create minimal test case
|
||||
import { VectorStoreIndex } from 'llamaindex';
|
||||
|
||||
async function testBasic() {
|
||||
try {
|
||||
console.log('Testing basic import...');
|
||||
const index = new VectorStoreIndex();
|
||||
console.log('Success!');
|
||||
} catch (error) {
|
||||
console.error('Error:', error);
|
||||
}
|
||||
}
|
||||
|
||||
testBasic();
|
||||
```
|
||||
|
||||
## Getting Help
|
||||
|
||||
### Before Asking for Help
|
||||
|
||||
1. **Check this troubleshooting guide**
|
||||
2. **Search existing GitHub issues**
|
||||
3. **Try minimal reproduction**
|
||||
4. **Check your environment configuration**
|
||||
|
||||
### When Reporting Issues
|
||||
|
||||
Include:
|
||||
- Node.js version (`node --version`)
|
||||
- Package versions (`npm list llamaindex`)
|
||||
- Environment (Node.js, Cloudflare Workers, Vercel, etc.)
|
||||
- Minimal code reproduction
|
||||
- Full error message and stack trace
|
||||
|
||||
### Useful Resources
|
||||
|
||||
- [GitHub Issues](https://github.com/run-llama/LlamaIndexTS/issues)
|
||||
- [Discord Community](https://discord.gg/dGcwcsnxhU)
|
||||
- [Documentation](https://docs.llamaindex.ai/)
|
||||
|
||||
## Next Steps
|
||||
|
||||
If you're still experiencing issues:
|
||||
|
||||
1. **Check specific deployment guides:**
|
||||
- [Server APIs](/docs/llamaindex/getting_started/installation/server-apis)
|
||||
- [Serverless Functions](/docs/llamaindex/getting_started/installation/serverless)
|
||||
- [Next.js Applications](/docs/llamaindex/getting_started/installation/nextjs)
|
||||
|
||||
2. **Open an issue** on GitHub with a minimal reproduction
|
||||
|
||||
3. **Join our Discord** for community support
|
||||
@@ -1,99 +0,0 @@
|
||||
---
|
||||
title: With TypeScript
|
||||
description: In this guide, you'll learn how to use LlamaIndex with TypeScript
|
||||
---
|
||||
|
||||
LlamaIndex.TS is written in TypeScript and designed to be used in TypeScript projects.
|
||||
|
||||
We put a lot of work on strong typing to make sure you have a great typing experience with code completion such as:
|
||||
|
||||
```ts twoslash
|
||||
import { PromptTemplate } from 'llamaindex'
|
||||
const promptTemplate = new PromptTemplate({
|
||||
template: `Context information from multiple sources is below.
|
||||
---------------------
|
||||
{context}
|
||||
---------------------
|
||||
Given the information from multiple sources and not prior knowledge.
|
||||
Answer the query in the style of a Shakespeare play"
|
||||
Query: {query}
|
||||
Answer:`,
|
||||
templateVars: ["context", "query"],
|
||||
});
|
||||
// @noErrors
|
||||
promptTemplate.format({
|
||||
c
|
||||
//^|
|
||||
})
|
||||
```
|
||||
|
||||
## Enable TypeScript
|
||||
|
||||
Make sure to set [moduleResolution](https://www.typescriptlang.org/docs/handbook/modules/theory.html#module-resolution) in your `tsconfig.json` file:
|
||||
|
||||
```json5
|
||||
{
|
||||
compilerOptions: {
|
||||
// ⬇️ add this line to your tsconfig.json
|
||||
moduleResolution: "bundler", // or "nodenext" | "node16" | "node"
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
We recommend using `bundler` or `nodenext`, but due to popularity of `node`, we still added support for it.
|
||||
|
||||
## Enable AsyncIterable for `Web Stream` API
|
||||
|
||||
Some modules uses `Web Stream` API like `ReadableStream` and `WritableStream`, you need to enable `DOM.AsyncIterable` in your `tsconfig.json`.
|
||||
|
||||
```json5
|
||||
{
|
||||
compilerOptions: {
|
||||
// ⬇️ add this lib to your tsconfig.json
|
||||
lib: ["DOM.AsyncIterable"],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
```typescript
|
||||
import { tool } from 'llamaindex'
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { openai } from "@llamaindex/openai";
|
||||
|
||||
Settings.llm = openai({
|
||||
model: "gpt-4o-mini",
|
||||
});
|
||||
|
||||
const addTool = tool({
|
||||
name: "add",
|
||||
description: "Adds two numbers",
|
||||
parameters: z.object({x: z.number(), y: z.number()}),
|
||||
execute: ({ x, y }) => x + y,
|
||||
});
|
||||
|
||||
const myAgent = agent({
|
||||
tools: [addTool],
|
||||
});
|
||||
|
||||
// Chat with the agent
|
||||
const context = myAgent.run("Hello, how are you?");
|
||||
|
||||
for await (const event of context) {
|
||||
if (event instanceof AgentStream) {
|
||||
for (const chunk of event.data.delta) {
|
||||
process.stdout.write(chunk); // stream response
|
||||
}
|
||||
} else {
|
||||
console.log(event); // other events
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
## Run TypeScript Script in Node.js
|
||||
|
||||
We recommend to use [tsx](https://www.npmjs.com/package/tsx) to run TypeScript script in Node.js.
|
||||
|
||||
```shell
|
||||
node --import tsx ./my-script.ts
|
||||
```
|
||||
@@ -1,23 +0,0 @@
|
||||
---
|
||||
title: With Vite
|
||||
description: In this guide, you'll learn how to use LlamaIndex with Vite
|
||||
---
|
||||
|
||||
Before you start, make sure you have try LlamaIndex.TS in Node.js to make sure you understand the basics.
|
||||
|
||||
<Card
|
||||
title="Getting Started with LlamaIndex.TS in Node.js"
|
||||
href="/docs/llamaindex/getting_started/installation/node"
|
||||
/>
|
||||
|
||||
Also, make sure you have a basic understanding of [Vite](https://vitejs.dev/).
|
||||
|
||||
## Why mention Vite?
|
||||
|
||||
Vite.js is widely used in building many web applications, like React.js, even for some native app like [Electron](https://www.electronjs.org/).
|
||||
|
||||
However, it's not a ready-to-use solution for a Node.js-like application using Vite, as Vite is designed for web applications(run in browser).
|
||||
|
||||
There's some plugin/framework based on Vite, like [Waku.gg](https://github.com/dai-shi/waku), or [Electron Vite](https://electron-vite.org/)
|
||||
|
||||
For now, we have no clear solution for bundling LlamaIndex.TS with Vite, if you have any idea/solution, please let us know.
|
||||
@@ -1,21 +1,118 @@
|
||||
---
|
||||
title: What is LlamaIndex.TS
|
||||
description: LlamaIndex is the leading data framework for building LLM applications
|
||||
title: Welcome to LlamaIndex.TS
|
||||
description: LlamaIndex.TS is the leading framework for utilizing context engineering to build LLM applications in JavaScript and TypeScript.
|
||||
---
|
||||
|
||||
LlamaIndex is a framework for building context-augmented generative AI applications with LLMs including agents and workflows.
|
||||
LlamaIndex.TS is a **framework for utilizing context engineering to build generative AI applications** with large language models. From rapid-prototyping RAG chatbots to deploying multi-agent workflows in production, LlamaIndex gives you everything you need — all in idiomatic TypeScript.
|
||||
|
||||
The TypeScript implementation is designed for JavaScript server side applications using <SiNodedotjs className="inline" color="#5FA04E" /> Node.js, <SiDeno className="inline" color="#70FFAF" /> Deno, <SiBun className="inline" /> Bun, <SiCloudflareworkers className="inline" color="#F38020" /> Cloudflare Workers, and more.
|
||||
Built for modern JavaScript runtimes like <SiNodedotjs className="inline" color="#5FA04E" /> **Node.js**, <SiDeno className="inline" color="#70FFAF" /> **Deno**, <SiBun className="inline" /> **Bun**, <SiCloudflareworkers className="inline" color="#F38020" /> **Cloudflare Workers**, and more.
|
||||
|
||||
LlamaIndex.TS provides tools for beginners, advanced users, and everyone in between.
|
||||
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 my-6">
|
||||
<a href="#introduction" className="block rounded-lg border border-gray-600/40 p-4 hover:border-gray-400 hover:bg-gray-700/20 no-underline">
|
||||
<h3 className="mb-1 text-lg font-semibold underline">Introduction</h3>
|
||||
<p className="text-sm text-gray-400 no-underline">Context engineering, agents & workflows — what do they mean?</p>
|
||||
</a>
|
||||
|
||||
Try it out with a starter example using StackBlitz:
|
||||
<a href="#use-cases" className="block rounded-lg border border-gray-600/40 p-4 hover:border-gray-400 hover:bg-gray-700/20 no-underline">
|
||||
<h3 className="mb-1 text-lg font-semibold underline">Use cases</h3>
|
||||
<p className="text-sm text-gray-400 no-underline">See what you can build with LlamaIndex.TS.</p>
|
||||
</a>
|
||||
|
||||
<a href="#getting-started" className="block rounded-lg border border-gray-600/40 p-4 hover:border-gray-400 hover:bg-gray-700/20 no-underline">
|
||||
<h3 className="mb-1 text-lg font-semibold underline">Getting started</h3>
|
||||
<p className="text-sm text-gray-400 no-underline">Your first app in 5 lines of code.</p>
|
||||
</a>
|
||||
|
||||
<a href="https://docs.cloud.llamaindex.ai/" className="block rounded-lg border border-gray-600/40 p-4 hover:border-gray-400 hover:bg-gray-700/20 no-underline" target="_blank" rel="noopener noreferrer">
|
||||
<h3 className="mb-1 text-lg font-semibold underline">LlamaCloud</h3>
|
||||
<p className="text-sm text-gray-400 no-underline">Managed parsing, extraction & retrieval pipelines.</p>
|
||||
</a>
|
||||
|
||||
<a href="#community" className="block rounded-lg border border-gray-600/40 p-4 hover:border-gray-400 hover:bg-gray-700/20 no-underline">
|
||||
<h3 className="mb-1 text-lg font-semibold underline">Community</h3>
|
||||
<p className="text-sm text-gray-400 no-underline">Join thousands of builders on Discord, Twitter, and more.</p>
|
||||
</a>
|
||||
|
||||
<a href="#related-projects" className="block rounded-lg border border-gray-600/40 p-4 hover:border-gray-400 hover:bg-gray-700/20 no-underline">
|
||||
<h3 className="mb-1 text-lg font-semibold underline">Related projects</h3>
|
||||
<p className="text-sm text-gray-400 no-underline">Connectors, demos & starter kits.</p>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
## Introduction
|
||||
|
||||
### What are agents?
|
||||
|
||||
[Agents](/docs/llamaindex/tutorials/agents/1_setup) are LLM-powered assistants that can reason, use external tools, and take actions to accomplish tasks such as research, data extraction, and automation.
|
||||
LlamaIndex.TS provides foundational building blocks for creating and orchestrating these agents.
|
||||
|
||||
### What are workflows?
|
||||
|
||||
[Workflows](/docs/llamaindex/tutorials/workflows) are multi-step, event-driven processes that combine agents, data connectors, and other tools to solve complex problems.
|
||||
With LlamaIndex.TS you can chain together retrieval, generation, and tool-calling steps and then deploy the entire pipeline as a microservice.
|
||||
|
||||
### What is context engineering?
|
||||
|
||||
LLMs come pre-trained on vast public corpora, but not on **your** private or domain-specific data.
|
||||
Context engineering bridges that gap by injecting the right pieces of your data into the LLM prompt at the right time.
|
||||
The most popular example is [Retrieval-Augmented Generation (RAG)](/docs/llamaindex/getting_started/concepts), but the same idea powers agent memory, evaluation, extraction, summarisation, and more.
|
||||
|
||||
LlamaIndex.TS gives you:
|
||||
|
||||
- **Data connectors** to ingest from APIs, files, SQL, and dozens more sources.
|
||||
- **Indexes & retrievers** to store and retrieve your data for LLM consumption.
|
||||
- **Agents and Engines** to query and use chat+reasoning interfaces over your data.
|
||||
- **Workflows** for fine-grained orchestration of your data and LLM-powered agents.
|
||||
- **Observability** integrations so you can iterate with confidence.
|
||||
|
||||
You can learn more about these concepts in our [concepts guide](/docs/llamaindex/getting_started/concepts).
|
||||
|
||||
## Use cases
|
||||
|
||||
Popular scenarios include:
|
||||
|
||||
- [LLM-Powered Agents](/docs/llamaindex/tutorials/agents/1_setup)
|
||||
- [Indexing and Retrieval](/docs/llamaindex/tutorials/rag)
|
||||
- [Extracting Structured Data](/docs/llamaindex/tutorials/structured_data_extraction)
|
||||
- [Custom Orchestration with Workflows](/docs/llamaindex/tutorials/workflows)
|
||||
|
||||
## Getting started
|
||||
|
||||
The fastest way to get started is in StackBlitz below — no local setup required:
|
||||
|
||||
<iframe
|
||||
className="w-full h-[440px]"
|
||||
aria-label="LlamaIndex.TS Starter"
|
||||
aria-description="This is a starter example for LlamaIndex.TS, it shows the basic usage of the library."
|
||||
aria-description="Interactive starter for LlamaIndex.TS"
|
||||
src="https://stackblitz.com/github/run-llama/LlamaIndexTS/tree/main/examples?embed=1&file=starter.ts"
|
||||
/>
|
||||
|
||||
You'll need an OpenAI API key to run this example. You can retrieve it from [OpenAI](https://platform.openai.com/api-keys).
|
||||
Want to learn more? We have several tutorials to get you started:
|
||||
|
||||
- [Installation + Runtime Guide](/docs/llamaindex/getting_started/installation)
|
||||
- [Create your first agent](/docs/llamaindex/tutorials/agents/1_setup)
|
||||
- [Learn how to index data and chat with it](/docs/llamaindex/tutorials/rag)
|
||||
- [Learn how to write your own workflows and agents](/docs/llamaindex/tutorials/workflows)
|
||||
|
||||
---
|
||||
|
||||
## LlamaCloud
|
||||
|
||||
Need an end-to-end managed pipeline? Check out **[LlamaCloud](https://cloud.llamaindex.ai/)**: best-in-class document parsing (LlamaParse), extraction (LlamaExtract), and indexing services with generous free tiers.
|
||||
|
||||
---
|
||||
|
||||
## Community
|
||||
|
||||
- [Twitter](https://twitter.com/llama_index)
|
||||
- [Discord](https://discord.gg/dGcwcsnxhU)
|
||||
- [LinkedIn](https://www.linkedin.com/company/llamaindex/)
|
||||
|
||||
We 💜 contributors! View our [contributing guide](https://github.com/run-llama/LlamaIndexTS/blob/main/CONTRIBUTING.md) to get started.
|
||||
|
||||
## Related projects
|
||||
|
||||
- [Python framework GitHub](https://github.com/run-llama/llama_index)
|
||||
- [Python docs](https://docs.llamaindex.ai/)
|
||||
- [create-llama](https://www.npmjs.com/package/create-llama) — scaffold a new project in seconds!
|
||||
- [UI Components](https://ui.llamaindex.ai/) — build chat applications with our Next.js components.
|
||||
|
||||
@@ -34,6 +34,7 @@ const jokeAgent = agent({
|
||||
// Run the workflow
|
||||
const result = await jokeAgent.run("Tell me something funny");
|
||||
console.log(result.data.result); // Baby Llama is called cria
|
||||
console.log(result.data.message); // { role: 'assistant', content: 'Baby Llama is called cria' }
|
||||
```
|
||||
|
||||
### Event Streaming
|
||||
|
||||
@@ -38,10 +38,13 @@ You should expect output something like:
|
||||
{
|
||||
result: '5 + 5 is 10. Then, 10 divided by 2 is 5.',
|
||||
state: {
|
||||
memory: ChatMemoryBuffer {
|
||||
chatStore: SimpleChatStore {},
|
||||
chatStoreKey: 'chat_history',
|
||||
tokenLimit: 750000
|
||||
memory: Memory {
|
||||
messages: [Array],
|
||||
tokenLimit: 30000,
|
||||
shortTermTokenLimitRatio: 0.7,
|
||||
memoryBlocks: [],
|
||||
memoryCursor: 0,
|
||||
adapters: [Object]
|
||||
},
|
||||
scratchpad: [],
|
||||
currentAgentName: 'Agent',
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @llamaindex/cloudflare-worker-agent-test
|
||||
|
||||
## 0.0.181
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.20
|
||||
|
||||
## 0.0.180
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/cloudflare-worker-agent-test",
|
||||
"version": "0.0.180",
|
||||
"version": "0.0.181",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/llama-parse-browser-test
|
||||
|
||||
## 0.0.80
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [2967d57]
|
||||
- @llamaindex/cloud@4.0.25
|
||||
|
||||
## 0.0.79
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/llama-parse-browser-test",
|
||||
"private": true,
|
||||
"version": "0.0.79",
|
||||
"version": "0.0.80",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @llamaindex/next-agent-test
|
||||
|
||||
## 0.1.181
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.20
|
||||
|
||||
## 0.1.180
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/next-agent-test",
|
||||
"version": "0.1.180",
|
||||
"version": "0.1.181",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# test-edge-runtime
|
||||
|
||||
## 0.1.180
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.20
|
||||
|
||||
## 0.1.179
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/nextjs-edge-runtime-test",
|
||||
"version": "0.1.179",
|
||||
"version": "0.1.180",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @llamaindex/next-node-runtime
|
||||
|
||||
## 0.1.50
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.20
|
||||
- @llamaindex/huggingface@0.1.21
|
||||
- @llamaindex/readers@3.1.15
|
||||
|
||||
## 0.1.49
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @llamaindex/huggingface@0.1.20
|
||||
|
||||
## 0.1.48
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/next-node-runtime-test",
|
||||
"version": "0.1.48",
|
||||
"version": "0.1.50",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# vite-import-llamaindex
|
||||
|
||||
## 0.0.47
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.20
|
||||
|
||||
## 0.0.46
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "vite-import-llamaindex",
|
||||
"private": true,
|
||||
"version": "0.0.46",
|
||||
"version": "0.0.47",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "vite build",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @llamaindex/waku-query-engine-test
|
||||
|
||||
## 0.0.181
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.20
|
||||
|
||||
## 0.0.180
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/waku-query-engine-test",
|
||||
"version": "0.0.180",
|
||||
"version": "0.0.181",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
|
||||
@@ -1,5 +1,80 @@
|
||||
# examples
|
||||
|
||||
## 0.3.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [650eeb1]
|
||||
- Updated dependencies [a8ec08c]
|
||||
- Updated dependencies [2967d57]
|
||||
- @llamaindex/google@0.3.15
|
||||
- @llamaindex/core@0.6.16
|
||||
- @llamaindex/workflow@1.1.16
|
||||
- @llamaindex/cloud@4.0.25
|
||||
- llamaindex@0.11.20
|
||||
- @llamaindex/node-parser@2.0.16
|
||||
- @llamaindex/anthropic@0.3.18
|
||||
- @llamaindex/assemblyai@0.1.15
|
||||
- @llamaindex/clip@0.0.67
|
||||
- @llamaindex/cohere@0.0.30
|
||||
- @llamaindex/deepinfra@0.0.67
|
||||
- @llamaindex/discord@0.1.15
|
||||
- @llamaindex/huggingface@0.1.21
|
||||
- @llamaindex/jinaai@0.0.27
|
||||
- @llamaindex/mistral@0.1.16
|
||||
- @llamaindex/mixedbread@0.0.30
|
||||
- @llamaindex/notion@0.1.15
|
||||
- @llamaindex/ollama@0.1.16
|
||||
- @llamaindex/openai@0.4.11
|
||||
- @llamaindex/perplexity@0.0.24
|
||||
- @llamaindex/portkey-ai@0.0.58
|
||||
- @llamaindex/replicate@0.0.58
|
||||
- @llamaindex/bm25-retriever@0.0.5
|
||||
- @llamaindex/astra@0.0.30
|
||||
- @llamaindex/azure@0.1.28
|
||||
- @llamaindex/chroma@0.0.30
|
||||
- @llamaindex/elastic-search@0.1.16
|
||||
- @llamaindex/firestore@1.0.23
|
||||
- @llamaindex/milvus@0.1.25
|
||||
- @llamaindex/mongodb@0.0.31
|
||||
- @llamaindex/pinecone@0.1.16
|
||||
- @llamaindex/postgres@0.0.59
|
||||
- @llamaindex/qdrant@0.1.26
|
||||
- @llamaindex/supabase@0.1.17
|
||||
- @llamaindex/upstash@0.0.30
|
||||
- @llamaindex/weaviate@0.0.31
|
||||
- @llamaindex/vercel@0.1.16
|
||||
- @llamaindex/voyage-ai@1.0.22
|
||||
- @llamaindex/readers@3.1.15
|
||||
- @llamaindex/tools@0.1.6
|
||||
- @llamaindex/deepseek@0.0.28
|
||||
- @llamaindex/fireworks@0.0.27
|
||||
- @llamaindex/groq@0.0.83
|
||||
- @llamaindex/together@0.0.27
|
||||
- @llamaindex/vllm@0.0.53
|
||||
- @llamaindex/xai@0.0.14
|
||||
|
||||
## 0.3.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [d8f4f6a]
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/supabase@0.1.16
|
||||
- @llamaindex/openai@0.4.10
|
||||
- @llamaindex/clip@0.0.66
|
||||
- @llamaindex/deepinfra@0.0.66
|
||||
- @llamaindex/deepseek@0.0.27
|
||||
- @llamaindex/fireworks@0.0.26
|
||||
- @llamaindex/groq@0.0.82
|
||||
- @llamaindex/huggingface@0.1.20
|
||||
- @llamaindex/jinaai@0.0.26
|
||||
- @llamaindex/perplexity@0.0.23
|
||||
- @llamaindex/azure@0.1.27
|
||||
- @llamaindex/together@0.0.26
|
||||
- @llamaindex/vllm@0.0.52
|
||||
- @llamaindex/xai@0.0.13
|
||||
|
||||
## 0.3.30
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -24,6 +24,7 @@ async function main() {
|
||||
state: result.data.state,
|
||||
});
|
||||
console.log(`${JSON.stringify(caResult, null, 2)}`);
|
||||
console.log("assistant message:", result.data.message);
|
||||
}
|
||||
|
||||
main().catch((error) => {
|
||||
|
||||
+47
-47
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/examples",
|
||||
"version": "0.3.30",
|
||||
"version": "0.3.32",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"lint": "eslint .",
|
||||
@@ -11,52 +11,52 @@
|
||||
"@azure/cosmos": "^4.1.1",
|
||||
"@azure/identity": "^4.4.1",
|
||||
"@azure/search-documents": "^12.1.0",
|
||||
"@llamaindex/anthropic": "^0.3.17",
|
||||
"@llamaindex/assemblyai": "^0.1.14",
|
||||
"@llamaindex/astra": "^0.0.29",
|
||||
"@llamaindex/azure": "^0.1.26",
|
||||
"@llamaindex/bm25-retriever": "^0.0.4",
|
||||
"@llamaindex/chroma": "^0.0.29",
|
||||
"@llamaindex/clip": "^0.0.65",
|
||||
"@llamaindex/cloud": "^4.0.24",
|
||||
"@llamaindex/cohere": "^0.0.29",
|
||||
"@llamaindex/core": "^0.6.15",
|
||||
"@llamaindex/deepinfra": "^0.0.65",
|
||||
"@llamaindex/deepseek": "^0.0.26",
|
||||
"@llamaindex/discord": "^0.1.14",
|
||||
"@llamaindex/elastic-search": "^0.1.15",
|
||||
"@llamaindex/anthropic": "^0.3.18",
|
||||
"@llamaindex/assemblyai": "^0.1.15",
|
||||
"@llamaindex/astra": "^0.0.30",
|
||||
"@llamaindex/azure": "^0.1.28",
|
||||
"@llamaindex/bm25-retriever": "^0.0.5",
|
||||
"@llamaindex/chroma": "^0.0.30",
|
||||
"@llamaindex/clip": "^0.0.67",
|
||||
"@llamaindex/cloud": "^4.0.25",
|
||||
"@llamaindex/cohere": "^0.0.30",
|
||||
"@llamaindex/core": "^0.6.16",
|
||||
"@llamaindex/deepinfra": "^0.0.67",
|
||||
"@llamaindex/deepseek": "^0.0.28",
|
||||
"@llamaindex/discord": "^0.1.15",
|
||||
"@llamaindex/elastic-search": "^0.1.16",
|
||||
"@llamaindex/env": "^0.1.30",
|
||||
"@llamaindex/firestore": "^1.0.22",
|
||||
"@llamaindex/fireworks": "^0.0.25",
|
||||
"@llamaindex/google": "^0.3.14",
|
||||
"@llamaindex/groq": "^0.0.81",
|
||||
"@llamaindex/huggingface": "^0.1.19",
|
||||
"@llamaindex/jinaai": "^0.0.25",
|
||||
"@llamaindex/milvus": "^0.1.24",
|
||||
"@llamaindex/mistral": "^0.1.15",
|
||||
"@llamaindex/mixedbread": "^0.0.29",
|
||||
"@llamaindex/mongodb": "^0.0.30",
|
||||
"@llamaindex/node-parser": "^2.0.15",
|
||||
"@llamaindex/notion": "^0.1.14",
|
||||
"@llamaindex/ollama": "^0.1.15",
|
||||
"@llamaindex/openai": "^0.4.9",
|
||||
"@llamaindex/perplexity": "^0.0.22",
|
||||
"@llamaindex/pinecone": "^0.1.15",
|
||||
"@llamaindex/portkey-ai": "^0.0.57",
|
||||
"@llamaindex/postgres": "^0.0.58",
|
||||
"@llamaindex/qdrant": "^0.1.25",
|
||||
"@llamaindex/readers": "^3.1.14",
|
||||
"@llamaindex/replicate": "^0.0.57",
|
||||
"@llamaindex/supabase": "^0.1.15",
|
||||
"@llamaindex/together": "^0.0.25",
|
||||
"@llamaindex/tools": "^0.1.5",
|
||||
"@llamaindex/upstash": "^0.0.29",
|
||||
"@llamaindex/vercel": "^0.1.15",
|
||||
"@llamaindex/vllm": "^0.0.51",
|
||||
"@llamaindex/voyage-ai": "^1.0.21",
|
||||
"@llamaindex/weaviate": "^0.0.30",
|
||||
"@llamaindex/workflow": "^1.1.15",
|
||||
"@llamaindex/xai": "^0.0.12",
|
||||
"@llamaindex/firestore": "^1.0.23",
|
||||
"@llamaindex/fireworks": "^0.0.27",
|
||||
"@llamaindex/google": "^0.3.15",
|
||||
"@llamaindex/groq": "^0.0.83",
|
||||
"@llamaindex/huggingface": "^0.1.21",
|
||||
"@llamaindex/jinaai": "^0.0.27",
|
||||
"@llamaindex/milvus": "^0.1.25",
|
||||
"@llamaindex/mistral": "^0.1.16",
|
||||
"@llamaindex/mixedbread": "^0.0.30",
|
||||
"@llamaindex/mongodb": "^0.0.31",
|
||||
"@llamaindex/node-parser": "^2.0.16",
|
||||
"@llamaindex/notion": "^0.1.15",
|
||||
"@llamaindex/ollama": "^0.1.16",
|
||||
"@llamaindex/openai": "^0.4.11",
|
||||
"@llamaindex/perplexity": "^0.0.24",
|
||||
"@llamaindex/pinecone": "^0.1.16",
|
||||
"@llamaindex/portkey-ai": "^0.0.58",
|
||||
"@llamaindex/postgres": "^0.0.59",
|
||||
"@llamaindex/qdrant": "^0.1.26",
|
||||
"@llamaindex/readers": "^3.1.15",
|
||||
"@llamaindex/replicate": "^0.0.58",
|
||||
"@llamaindex/supabase": "^0.1.17",
|
||||
"@llamaindex/together": "^0.0.27",
|
||||
"@llamaindex/tools": "^0.1.6",
|
||||
"@llamaindex/upstash": "^0.0.30",
|
||||
"@llamaindex/vercel": "^0.1.16",
|
||||
"@llamaindex/vllm": "^0.0.53",
|
||||
"@llamaindex/voyage-ai": "^1.0.22",
|
||||
"@llamaindex/weaviate": "^0.0.31",
|
||||
"@llamaindex/workflow": "^1.1.16",
|
||||
"@llamaindex/xai": "^0.0.14",
|
||||
"@notionhq/client": "^4.0.0",
|
||||
"@pinecone-database/pinecone": "^4.0.0",
|
||||
"@vercel/postgres": "^0.10.0",
|
||||
@@ -65,7 +65,7 @@
|
||||
"commander": "^12.1.0",
|
||||
"dotenv": "^17.2.0",
|
||||
"js-tiktoken": "^1.0.14",
|
||||
"llamaindex": "^0.11.19",
|
||||
"llamaindex": "^0.11.20",
|
||||
"mongodb": "6.7.0",
|
||||
"postgres": "^3.4.4",
|
||||
"wikipedia": "^2.1.2",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @llamaindex/autotool
|
||||
|
||||
## 8.0.20
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.20
|
||||
|
||||
## 8.0.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/autotool-01-node-example
|
||||
|
||||
## 0.0.128
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.20
|
||||
- @llamaindex/autotool@8.0.20
|
||||
|
||||
## 0.0.127
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
"scripts": {
|
||||
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
|
||||
},
|
||||
"version": "0.0.127"
|
||||
"version": "0.0.128"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
|
||||
"directory": "packages/autotool"
|
||||
},
|
||||
"version": "8.0.19",
|
||||
"version": "8.0.20",
|
||||
"description": "auto transpile your JS function to LLM Agent compatible",
|
||||
"files": [
|
||||
"dist",
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# @llamaindex/cloud
|
||||
|
||||
## 4.0.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 2967d57: Default to \_public agent url id
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 4.0.24
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/cloud",
|
||||
"version": "4.0.24",
|
||||
"version": "4.0.25",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
||||
@@ -33,7 +33,7 @@ export class AgentClient<T = unknown> {
|
||||
apiKey = getEnv("LLAMA_CLOUD_API_KEY"),
|
||||
baseUrl = "https://api.cloud.llamaindex.ai/",
|
||||
collection = "default",
|
||||
agentUrlId = "default",
|
||||
agentUrlId = "_public",
|
||||
}: {
|
||||
apiKey?: string;
|
||||
baseUrl?: string;
|
||||
@@ -127,7 +127,7 @@ export class AgentClient<T = unknown> {
|
||||
}
|
||||
|
||||
/**
|
||||
* List agent data
|
||||
* Search agent data
|
||||
*/
|
||||
async search(
|
||||
options: SearchAgentDataOptions,
|
||||
@@ -275,7 +275,8 @@ export interface AgentDataClientOptions<T = unknown> {
|
||||
collection?: string;
|
||||
}
|
||||
/**
|
||||
* Create a new AsyncAgentDataClient instance
|
||||
* Create a new AsyncAgentDataClient instance. Does it's best to infer an agent url id from environment.
|
||||
* Pass in the window url and/or env to infer the agent url id from them.
|
||||
* @param options - The options for the client
|
||||
* @returns A new AgentClient instance
|
||||
*/
|
||||
@@ -283,20 +284,34 @@ export function createAgentDataClient<T = unknown>({
|
||||
apiKey,
|
||||
baseUrl,
|
||||
windowUrl,
|
||||
env,
|
||||
agentUrlId,
|
||||
collection = "default",
|
||||
}: {
|
||||
apiKey?: string;
|
||||
baseUrl?: string;
|
||||
windowUrl?: string;
|
||||
env?: Record<string, string>;
|
||||
agentUrlId?: string;
|
||||
collection?: string;
|
||||
} = {}): AgentClient<T> {
|
||||
if (env && !agentUrlId) {
|
||||
agentUrlId =
|
||||
env.LLAMA_DEPLOY_DEPLOYMENT_NAME ||
|
||||
env.NEXT_PUBLIC_LLAMA_DEPLOY_DEPLOYMENT_NAME ||
|
||||
env.VITE_LLAMA_DEPLOY_DEPLOYMENT_NAME;
|
||||
}
|
||||
if (windowUrl && !agentUrlId) {
|
||||
try {
|
||||
const path = new URL(windowUrl).pathname;
|
||||
// /deployments/<agent-url-id>/ui/ -> ["", "deployments", "<agent-url-id>", "ui"]
|
||||
agentUrlId = path.split("/")[2];
|
||||
const url = new URL(windowUrl);
|
||||
const path = url.pathname;
|
||||
const isLocalhost = // local agents should default to _public, otherwise a full deployment is required
|
||||
url.hostname.includes("localhost") ||
|
||||
url.hostname.includes("127.0.0.1");
|
||||
if (path.startsWith("/deployments/") && !isLocalhost) {
|
||||
// /deployments/<agent-url-id>/ui/ -> ["", "deployments", "<agent-url-id>", "ui"]
|
||||
agentUrlId = path.split("/")[2];
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn(
|
||||
"Failed to infer agent url id from window url, falling back to default",
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @llamaindex/core
|
||||
|
||||
## 0.6.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- a8ec08c: fix: ensure correct message content in agent workflow
|
||||
|
||||
## 0.6.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/core",
|
||||
"type": "module",
|
||||
"version": "0.6.15",
|
||||
"version": "0.6.16",
|
||||
"description": "LlamaIndex Core Module",
|
||||
"exports": {
|
||||
"./agent": {
|
||||
|
||||
@@ -56,10 +56,45 @@ export function prettifyError(error: unknown): string {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a stringfied JSON with double quotes removed.
|
||||
*
|
||||
* @param value - The JSON value to stringify
|
||||
* @returns The stringified JSON with no double quotes
|
||||
*/
|
||||
export function stringifyJSONToMessageContent(value: JSONValue): string {
|
||||
return JSON.stringify(value, null, 2).replace(/"([^"]*)"/g, "$1");
|
||||
}
|
||||
|
||||
export function assertIsJSONValue(value: unknown): asserts value is JSONValue {
|
||||
if (
|
||||
typeof value === "string" ||
|
||||
typeof value === "number" ||
|
||||
typeof value === "boolean"
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
for (const item of value) {
|
||||
assertIsJSONValue(item);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (typeof value === "object" && value !== null) {
|
||||
for (const [key, val] of Object.entries(value)) {
|
||||
if (typeof key !== "string") {
|
||||
throw new Error(`Invalid object key: ${key}`);
|
||||
}
|
||||
assertIsJSONValue(val);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
throw new Error(`Value is not a valid JSONValue: ${String(value)}`);
|
||||
}
|
||||
|
||||
export {
|
||||
extractDataUrlComponents,
|
||||
extractImage,
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
# @llamaindex/experimental
|
||||
|
||||
## 0.0.197
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.20
|
||||
|
||||
## 0.0.196
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/experimental",
|
||||
"description": "Experimental package for LlamaIndexTS",
|
||||
"version": "0.0.196",
|
||||
"version": "0.0.197",
|
||||
"type": "module",
|
||||
"types": "dist/type/index.d.ts",
|
||||
"main": "dist/cjs/index.js",
|
||||
|
||||
@@ -1,5 +1,16 @@
|
||||
# llamaindex
|
||||
|
||||
## 0.11.20
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- Updated dependencies [2967d57]
|
||||
- @llamaindex/core@0.6.16
|
||||
- @llamaindex/workflow@1.1.16
|
||||
- @llamaindex/cloud@4.0.25
|
||||
- @llamaindex/node-parser@2.0.16
|
||||
|
||||
## 0.11.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "llamaindex",
|
||||
"version": "0.11.19",
|
||||
"version": "0.11.20",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"keywords": [
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @llamaindex/core-test
|
||||
|
||||
## 0.1.12
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @llamaindex/openai@0.4.11
|
||||
|
||||
## 0.1.11
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.1.10
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/llamaindex-test",
|
||||
"private": true,
|
||||
"version": "0.1.10",
|
||||
"version": "0.1.12",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"test": "vitest run"
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/node-parser
|
||||
|
||||
## 2.0.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 2.0.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/node-parser",
|
||||
"version": "2.0.15",
|
||||
"version": "2.0.16",
|
||||
"description": "Node parser for LlamaIndex",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/anthropic
|
||||
|
||||
## 0.3.18
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.3.17
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/anthropic",
|
||||
"description": "Anthropic Adapter for LlamaIndex",
|
||||
"version": "0.3.17",
|
||||
"version": "0.3.18",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/assemblyai
|
||||
|
||||
## 0.1.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.1.14
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/assemblyai",
|
||||
"description": "AssemblyAI Reader for LlamaIndex",
|
||||
"version": "0.1.14",
|
||||
"version": "0.1.15",
|
||||
"type": "module",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.cjs",
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# @llamaindex/community
|
||||
|
||||
## 0.0.111
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 678b327: feat: added apac bedrock models
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.0.110
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/aws",
|
||||
"description": "AWS package for LlamaIndexTS",
|
||||
"version": "0.0.110",
|
||||
"version": "0.0.111",
|
||||
"type": "module",
|
||||
"types": "dist/type/index.d.ts",
|
||||
"main": "dist/cjs/index.js",
|
||||
|
||||
@@ -134,6 +134,19 @@ export const INFERENCE_BEDROCK_MODELS = {
|
||||
EU_AMAZON_NOVA_PRO_1: "eu.amazon.nova-pro-v1:0",
|
||||
EU_AMAZON_NOVA_LITE_1: "eu.amazon.nova-lite-v1:0",
|
||||
EU_AMAZON_NOVA_MICRO_1: "eu.amazon.nova-micro-v1:0",
|
||||
|
||||
APAC_ANTHROPIC_CLAUDE_3_5_SONNET:
|
||||
"apac.anthropic.claude-3-5-sonnet-20240620-v1:0",
|
||||
APAC_ANTHROPIC_CLAUDE_3_5_SONNET_V2:
|
||||
"apac.anthropic.claude-3-5-sonnet-20241022-v2:0",
|
||||
APAC_ANTHROPIC_CLAUDE_3_7_SONNET:
|
||||
"apac.anthropic.claude-3-7-sonnet-20250219-v1:0",
|
||||
APAC_ANTHROPIC_CLAUDE_3_HAIKU: "apac.anthropic.claude-3-haiku-20240307-v1:0",
|
||||
APAC_ANTHROPIC_CLAUDE_3_SONNET:
|
||||
"apac.anthropic.claude-3-sonnet-20240229-v1:0",
|
||||
APAC_AMAZON_NOVA_PRO_1: "apac.amazon.nova-pro-v1:0",
|
||||
APAC_AMAZON_NOVA_LITE_1: "apac.amazon.nova-lite-v1:0",
|
||||
APAC_AMAZON_NOVA_MICRO_1: "apac.amazon.nova-micro-v1:0",
|
||||
};
|
||||
|
||||
export type INFERENCE_BEDROCK_MODELS =
|
||||
@@ -206,6 +219,24 @@ export const INFERENCE_TO_BEDROCK_MAP: Record<
|
||||
BEDROCK_MODELS.AMAZON_NOVA_LITE_1,
|
||||
[INFERENCE_BEDROCK_MODELS.EU_AMAZON_NOVA_MICRO_1]:
|
||||
BEDROCK_MODELS.AMAZON_NOVA_MICRO_1,
|
||||
|
||||
[INFERENCE_BEDROCK_MODELS.APAC_ANTHROPIC_CLAUDE_3_5_SONNET]:
|
||||
BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_5_SONNET,
|
||||
[INFERENCE_BEDROCK_MODELS.APAC_ANTHROPIC_CLAUDE_3_5_SONNET_V2]:
|
||||
BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_5_SONNET_V2,
|
||||
[INFERENCE_BEDROCK_MODELS.APAC_ANTHROPIC_CLAUDE_3_7_SONNET]:
|
||||
BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_7_SONNET,
|
||||
[INFERENCE_BEDROCK_MODELS.APAC_ANTHROPIC_CLAUDE_3_HAIKU]:
|
||||
BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_HAIKU,
|
||||
[INFERENCE_BEDROCK_MODELS.APAC_ANTHROPIC_CLAUDE_3_SONNET]:
|
||||
BEDROCK_MODELS.ANTHROPIC_CLAUDE_3_SONNET,
|
||||
|
||||
[INFERENCE_BEDROCK_MODELS.APAC_AMAZON_NOVA_PRO_1]:
|
||||
BEDROCK_MODELS.AMAZON_NOVA_PRO_1,
|
||||
[INFERENCE_BEDROCK_MODELS.APAC_AMAZON_NOVA_LITE_1]:
|
||||
BEDROCK_MODELS.AMAZON_NOVA_LITE_1,
|
||||
[INFERENCE_BEDROCK_MODELS.APAC_AMAZON_NOVA_MICRO_1]:
|
||||
BEDROCK_MODELS.AMAZON_NOVA_MICRO_1,
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @llamaindex/clip
|
||||
|
||||
## 0.0.67
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
- @llamaindex/openai@0.4.11
|
||||
|
||||
## 0.0.66
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.0.65
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/clip",
|
||||
"description": "Clip Embedding Adapter for LlamaIndex",
|
||||
"version": "0.0.65",
|
||||
"version": "0.0.67",
|
||||
"type": "module",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.cjs",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/cohere
|
||||
|
||||
## 0.0.30
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.0.29
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/cohere",
|
||||
"description": "Cohere Adapter for LlamaIndex",
|
||||
"version": "0.0.29",
|
||||
"version": "0.0.30",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @llamaindex/deepinfra
|
||||
|
||||
## 0.0.67
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
- @llamaindex/openai@0.4.11
|
||||
|
||||
## 0.0.66
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.0.65
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/deepinfra",
|
||||
"description": "Deepinfra Adapter for LlamaIndex",
|
||||
"version": "0.0.65",
|
||||
"version": "0.0.67",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @llamaindex/deepseek
|
||||
|
||||
## 0.0.28
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @llamaindex/openai@0.4.11
|
||||
|
||||
## 0.0.27
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.0.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/deepseek",
|
||||
"description": "DeepSeek Adapter for LlamaIndex",
|
||||
"version": "0.0.26",
|
||||
"version": "0.0.28",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/discord
|
||||
|
||||
## 0.1.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.1.14
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/discord",
|
||||
"description": "Discord Reader for LlamaIndex",
|
||||
"version": "0.1.14",
|
||||
"version": "0.1.15",
|
||||
"type": "module",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.cjs",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/excel
|
||||
|
||||
## 0.1.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.1.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/excel",
|
||||
"description": "Excel Reader for LlamaIndex",
|
||||
"version": "0.1.15",
|
||||
"version": "0.1.16",
|
||||
"type": "module",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.cjs",
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @llamaindex/fireworks
|
||||
|
||||
## 0.0.27
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @llamaindex/openai@0.4.11
|
||||
|
||||
## 0.0.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.0.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/fireworks",
|
||||
"description": "Fireworks Adapter for LlamaIndex",
|
||||
"version": "0.0.25",
|
||||
"version": "0.0.27",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# @llamaindex/google
|
||||
|
||||
## 0.3.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 650eeb1: fix: GeminiEmbedding should send batches of max 100
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.3.14
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/google",
|
||||
"description": "Google Adapter for LlamaIndex",
|
||||
"version": "0.3.14",
|
||||
"version": "0.3.15",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -0,0 +1,248 @@
|
||||
import { beforeEach, describe, expect, test, vi } from "vitest";
|
||||
import {
|
||||
DEFAULT_EMBED_BATCH_SIZE,
|
||||
GEMINI_EMBEDDING_MODEL,
|
||||
GeminiEmbedding,
|
||||
} from "./GeminiEmbedding";
|
||||
|
||||
// Mock the Google GenAI module
|
||||
const mockEmbedContent = vi.fn();
|
||||
vi.mock("@google/genai", () => ({
|
||||
GoogleGenAI: vi.fn().mockImplementation(() => ({
|
||||
models: {
|
||||
embedContent: mockEmbedContent,
|
||||
},
|
||||
})),
|
||||
}));
|
||||
|
||||
describe("GeminiEmbedding", () => {
|
||||
let geminiEmbedding: GeminiEmbedding;
|
||||
// Move capturedBatches to outer scope so all tests can access it
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
let capturedBatches: any[];
|
||||
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
geminiEmbedding = new GeminiEmbedding({
|
||||
model: GEMINI_EMBEDDING_MODEL.EMBEDDING_001,
|
||||
apiKey: "test-api-key",
|
||||
});
|
||||
// Default mock for other tests
|
||||
mockEmbedContent.mockResolvedValue({
|
||||
embeddings: [
|
||||
{ values: [0.1, 0.2, 0.3] },
|
||||
{ values: [0.4, 0.5, 0.6] },
|
||||
{ values: [0.7, 0.8, 0.9] },
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
describe("getTextEmbeddingsBatch", () => {
|
||||
beforeEach(() => {
|
||||
// Reset and set up capturedBatches and the mock implementation for all tests in this suite
|
||||
capturedBatches = [];
|
||||
mockEmbedContent.mockImplementation((args) => {
|
||||
capturedBatches.push({
|
||||
...args,
|
||||
contents: Array.isArray(args.contents)
|
||||
? [...args.contents]
|
||||
: args.contents,
|
||||
});
|
||||
return Promise.resolve({
|
||||
embeddings: Array.from(
|
||||
{ length: Array.isArray(args.contents) ? args.contents.length : 1 },
|
||||
(_, i) => ({
|
||||
values: [i * 0.1, i * 0.2, i * 0.3],
|
||||
}),
|
||||
),
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
test("should respect batch size limit of 10 for texts longer than 10", async () => {
|
||||
// Create a list of 2.5x the batch size texts, to exceed the batch size
|
||||
const texts = Array.from(
|
||||
{ length: DEFAULT_EMBED_BATCH_SIZE * 2.5 },
|
||||
(_, i) => `text ${i + 1}`,
|
||||
);
|
||||
|
||||
await geminiEmbedding.getTextEmbeddingsBatch(texts);
|
||||
|
||||
// Verify that embedContent was called exactly 3 times (ceil(250/100) = 3)
|
||||
expect(mockEmbedContent).toHaveBeenCalledTimes(3);
|
||||
// Verify that each call had no more than 100 texts
|
||||
const calls = mockEmbedContent.mock.calls;
|
||||
|
||||
// First batch should have DEFAULT_EMBED_BATCH_SIZE texts
|
||||
expect(capturedBatches[0].contents).toHaveLength(
|
||||
DEFAULT_EMBED_BATCH_SIZE,
|
||||
);
|
||||
expect(capturedBatches[0].contents).toEqual(
|
||||
texts.slice(0 * DEFAULT_EMBED_BATCH_SIZE, 1 * DEFAULT_EMBED_BATCH_SIZE),
|
||||
);
|
||||
|
||||
// Second batch should have DEFAULT_EMBED_BATCH_SIZE texts
|
||||
expect(capturedBatches[1].contents).toHaveLength(
|
||||
DEFAULT_EMBED_BATCH_SIZE,
|
||||
);
|
||||
expect(capturedBatches[1].contents).toEqual(
|
||||
texts.slice(1 * DEFAULT_EMBED_BATCH_SIZE, 2 * DEFAULT_EMBED_BATCH_SIZE),
|
||||
);
|
||||
|
||||
// Third batch should have 0.5 * DEFAULT_EMBED_BATCH_SIZE texts (remaining)
|
||||
expect(capturedBatches[2].contents).toHaveLength(
|
||||
DEFAULT_EMBED_BATCH_SIZE * 0.5,
|
||||
);
|
||||
expect(capturedBatches[2].contents).toEqual(
|
||||
texts.slice(
|
||||
2 * DEFAULT_EMBED_BATCH_SIZE,
|
||||
2.5 * DEFAULT_EMBED_BATCH_SIZE,
|
||||
),
|
||||
);
|
||||
});
|
||||
|
||||
test("should handle exactly DEFAULT_EMBED_BATCH_SIZE texts in a single batch", async () => {
|
||||
const texts = Array.from(
|
||||
{ length: DEFAULT_EMBED_BATCH_SIZE },
|
||||
(_, i) => `text ${i + 1}`,
|
||||
);
|
||||
|
||||
await geminiEmbedding.getTextEmbeddingsBatch(texts);
|
||||
|
||||
// Should be called exactly once
|
||||
expect(mockEmbedContent).toHaveBeenCalledTimes(1);
|
||||
// // Should contain all 100 texts
|
||||
expect(capturedBatches[0]?.contents).toHaveLength(
|
||||
DEFAULT_EMBED_BATCH_SIZE,
|
||||
);
|
||||
expect(capturedBatches[0]?.contents).toEqual(texts);
|
||||
});
|
||||
|
||||
test("should handle texts shorter than batch size", async () => {
|
||||
const short_batch_length = 5; // Less than DEFAULT_EMBED_BATCH_SIZE
|
||||
const texts = Array.from(
|
||||
{ length: short_batch_length },
|
||||
(_, i) => `text ${i + 1}`,
|
||||
);
|
||||
|
||||
await geminiEmbedding.getTextEmbeddingsBatch(texts);
|
||||
|
||||
// Should be called exactly once
|
||||
expect(mockEmbedContent).toHaveBeenCalledTimes(1);
|
||||
|
||||
// Should contain all 5 texts
|
||||
expect(capturedBatches[0].contents).toHaveLength(short_batch_length);
|
||||
expect(capturedBatches[0].contents).toEqual(texts);
|
||||
});
|
||||
|
||||
test("should handle large batches correctly (100 texts)", async () => {
|
||||
const n_batches = 10;
|
||||
const texts = Array.from(
|
||||
{ length: DEFAULT_EMBED_BATCH_SIZE * n_batches },
|
||||
(_, i) => `text ${i + 1}`,
|
||||
);
|
||||
|
||||
await geminiEmbedding.getTextEmbeddingsBatch(texts);
|
||||
|
||||
// Should be called exactly 10 times
|
||||
expect(mockEmbedContent).toHaveBeenCalledTimes(n_batches);
|
||||
|
||||
// Verify each batch has exactly DEFAULT_EMBED_BATCH_SIZE texts
|
||||
for (let i = 0; i < n_batches; i++) {
|
||||
expect(capturedBatches[i].contents).toHaveLength(
|
||||
DEFAULT_EMBED_BATCH_SIZE,
|
||||
);
|
||||
expect(capturedBatches[i].contents).toEqual(
|
||||
texts.slice(
|
||||
i * DEFAULT_EMBED_BATCH_SIZE,
|
||||
(i + 1) * DEFAULT_EMBED_BATCH_SIZE,
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test("should return correct embeddings for all texts", async () => {
|
||||
const texts = ["text1", "text2", "text3"];
|
||||
|
||||
mockEmbedContent.mockResolvedValueOnce({
|
||||
embeddings: [
|
||||
{ values: [0.1, 0.2, 0.3] },
|
||||
{ values: [0.4, 0.5, 0.6] },
|
||||
{ values: [0.7, 0.8, 0.9] },
|
||||
],
|
||||
});
|
||||
|
||||
const result = await geminiEmbedding.getTextEmbeddingsBatch(texts);
|
||||
|
||||
expect(result).toEqual([
|
||||
[0.1, 0.2, 0.3],
|
||||
[0.4, 0.5, 0.6],
|
||||
[0.7, 0.8, 0.9],
|
||||
]);
|
||||
});
|
||||
|
||||
test("should handle empty embeddings gracefully", async () => {
|
||||
const texts = ["text1", "text2"];
|
||||
|
||||
mockEmbedContent.mockResolvedValueOnce({
|
||||
embeddings: [{ values: undefined }, { values: [0.1, 0.2, 0.3] }],
|
||||
});
|
||||
|
||||
const result = await geminiEmbedding.getTextEmbeddingsBatch(texts);
|
||||
|
||||
expect(result).toEqual([[], [0.1, 0.2, 0.3]]);
|
||||
});
|
||||
|
||||
test("should handle missing embeddings array", async () => {
|
||||
const texts = ["text1"];
|
||||
|
||||
mockEmbedContent.mockResolvedValueOnce({
|
||||
embeddings: undefined,
|
||||
});
|
||||
|
||||
const result = await geminiEmbedding.getTextEmbeddingsBatch(texts);
|
||||
|
||||
expect(result).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("getTextEmbedding", () => {
|
||||
test("should call embedContent with single text", async () => {
|
||||
const text = "single text";
|
||||
|
||||
mockEmbedContent.mockResolvedValueOnce({
|
||||
embeddings: [{ values: [0.1, 0.2, 0.3] }],
|
||||
});
|
||||
|
||||
const result = await geminiEmbedding.getTextEmbedding(text);
|
||||
|
||||
expect(mockEmbedContent).toHaveBeenCalledTimes(1);
|
||||
expect(mockEmbedContent).toHaveBeenCalledWith({
|
||||
model: GEMINI_EMBEDDING_MODEL.EMBEDDING_001,
|
||||
contents: text,
|
||||
});
|
||||
expect(result).toEqual([0.1, 0.2, 0.3]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("constructor", () => {
|
||||
test("should set default model and batch size", () => {
|
||||
const embedding = new GeminiEmbedding({ apiKey: "test-key" });
|
||||
|
||||
expect(embedding.model).toBe(GEMINI_EMBEDDING_MODEL.EMBEDDING_001);
|
||||
expect(embedding.embedBatchSize).toBe(DEFAULT_EMBED_BATCH_SIZE);
|
||||
});
|
||||
|
||||
test("should use provided model", () => {
|
||||
const new_batch_size = 50;
|
||||
const embedding = new GeminiEmbedding({
|
||||
model: GEMINI_EMBEDDING_MODEL.TEXT_EMBEDDING_004,
|
||||
apiKey: "test-key",
|
||||
embedBatchSize: new_batch_size,
|
||||
});
|
||||
|
||||
expect(embedding.model).toBe(GEMINI_EMBEDDING_MODEL.TEXT_EMBEDDING_004);
|
||||
expect(embedding.embedBatchSize).toBe(new_batch_size);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,5 +1,9 @@
|
||||
import { GoogleGenAI, type GoogleGenAIOptions } from "@google/genai";
|
||||
import { BaseEmbedding } from "@llamaindex/core/embeddings";
|
||||
import {
|
||||
BaseEmbedding,
|
||||
batchEmbeddings,
|
||||
type BaseEmbeddingOptions,
|
||||
} from "@llamaindex/core/embeddings";
|
||||
import { getEnv } from "@llamaindex/env";
|
||||
|
||||
export enum GEMINI_EMBEDDING_MODEL {
|
||||
@@ -7,11 +11,15 @@ export enum GEMINI_EMBEDDING_MODEL {
|
||||
TEXT_EMBEDDING_004 = "text-embedding-004",
|
||||
}
|
||||
|
||||
// 100 is max batch size, see https://github.com/run-llama/LlamaIndexTS/pull/2099
|
||||
export const DEFAULT_EMBED_BATCH_SIZE = 100;
|
||||
|
||||
/**
|
||||
* Configuration options for GeminiEmbedding.
|
||||
*/
|
||||
export type GeminiEmbeddingOptions = {
|
||||
model?: GEMINI_EMBEDDING_MODEL;
|
||||
embedBatchSize?: number;
|
||||
} & GoogleGenAIOptions;
|
||||
|
||||
/**
|
||||
@@ -20,6 +28,7 @@ export type GeminiEmbeddingOptions = {
|
||||
export class GeminiEmbedding extends BaseEmbedding {
|
||||
model: GEMINI_EMBEDDING_MODEL;
|
||||
ai: GoogleGenAI;
|
||||
embedBatchSize: number = DEFAULT_EMBED_BATCH_SIZE;
|
||||
|
||||
constructor(opts?: GeminiEmbeddingOptions) {
|
||||
super();
|
||||
@@ -31,15 +40,27 @@ export class GeminiEmbedding extends BaseEmbedding {
|
||||
|
||||
this.ai = new GoogleGenAI({ ...opts, apiKey });
|
||||
this.model = opts?.model ?? GEMINI_EMBEDDING_MODEL.EMBEDDING_001;
|
||||
this.embedBatchSize = opts?.embedBatchSize ?? DEFAULT_EMBED_BATCH_SIZE;
|
||||
}
|
||||
|
||||
async getTextEmbeddingsBatch(texts: string[]): Promise<number[][]> {
|
||||
getTextEmbeddings = async (texts: string[]) => {
|
||||
const result = await this.ai.models.embedContent({
|
||||
model: this.model,
|
||||
contents: texts,
|
||||
});
|
||||
|
||||
return result.embeddings?.map((embedding) => embedding.values ?? []) ?? [];
|
||||
};
|
||||
|
||||
async getTextEmbeddingsBatch(
|
||||
texts: string[],
|
||||
options?: BaseEmbeddingOptions,
|
||||
): Promise<Array<number[]>> {
|
||||
return await batchEmbeddings(
|
||||
texts,
|
||||
this.getTextEmbeddings.bind(this),
|
||||
this.embedBatchSize,
|
||||
options,
|
||||
);
|
||||
}
|
||||
|
||||
async getTextEmbedding(text: string): Promise<number[]> {
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @llamaindex/groq
|
||||
|
||||
## 0.0.83
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @llamaindex/openai@0.4.11
|
||||
|
||||
## 0.0.82
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.0.81
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/groq",
|
||||
"description": "Groq Adapter for LlamaIndex",
|
||||
"version": "0.0.81",
|
||||
"version": "0.0.83",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @llamaindex/huggingface
|
||||
|
||||
## 0.1.21
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
- @llamaindex/openai@0.4.11
|
||||
|
||||
## 0.1.20
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.1.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/huggingface",
|
||||
"description": "Huggingface Adapter for LlamaIndex",
|
||||
"version": "0.1.19",
|
||||
"version": "0.1.21",
|
||||
"type": "module",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.cjs",
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @llamaindex/jinaai
|
||||
|
||||
## 0.0.27
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
- @llamaindex/openai@0.4.11
|
||||
|
||||
## 0.0.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.0.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/jinaai",
|
||||
"description": "JinaAI Adapter for LlamaIndex",
|
||||
"version": "0.0.25",
|
||||
"version": "0.0.27",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/mistral
|
||||
|
||||
## 0.1.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.1.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/mistral",
|
||||
"description": "Mistral Adapter for LlamaIndex",
|
||||
"version": "0.1.15",
|
||||
"version": "0.1.16",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/mixedbread
|
||||
|
||||
## 0.0.30
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.0.29
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/mixedbread",
|
||||
"description": "Mixedbread Adapter for LlamaIndex",
|
||||
"version": "0.0.29",
|
||||
"version": "0.0.30",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/notion
|
||||
|
||||
## 0.1.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.1.14
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/notion",
|
||||
"description": "Notion Reader for LlamaIndex",
|
||||
"version": "0.1.14",
|
||||
"version": "0.1.15",
|
||||
"type": "module",
|
||||
"types": "dist/index.d.ts",
|
||||
"main": "dist/index.cjs",
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
# @llamaindex/ollama
|
||||
|
||||
## 0.1.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.1.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/ollama",
|
||||
"description": "Ollama Adapter for LlamaIndex",
|
||||
"version": "0.1.15",
|
||||
"version": "0.1.16",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -1,5 +1,18 @@
|
||||
# @llamaindex/openai
|
||||
|
||||
## 0.4.11
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
|
||||
## 0.4.10
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 856dd8c: fix: assume new models are function call models
|
||||
|
||||
## 0.4.9
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/openai",
|
||||
"description": "OpenAI Adapter for LlamaIndex",
|
||||
"version": "0.4.9",
|
||||
"version": "0.4.11",
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
|
||||
@@ -383,8 +383,8 @@ export class OpenAI extends ToolCallLLM<OpenAIAdditionalChatOptions> {
|
||||
// skip parts that don't have any content
|
||||
if (
|
||||
!(
|
||||
choice.delta.content ||
|
||||
choice.delta.tool_calls ||
|
||||
choice.delta?.content ||
|
||||
choice.delta?.tool_calls ||
|
||||
choice.finish_reason
|
||||
)
|
||||
)
|
||||
|
||||
@@ -149,10 +149,9 @@ export function isFunctionCallingModel(llm: LLM): llm is OpenAI {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
const isChatModel = Object.keys(ALL_AVAILABLE_OPENAI_MODELS).includes(model);
|
||||
const isOld = model.includes("0314") || model.includes("0301");
|
||||
const isO1 = model.startsWith("o1");
|
||||
return isChatModel && !isOld && !isO1;
|
||||
return !isOld && !isO1;
|
||||
}
|
||||
|
||||
export function isReasoningModel(model: ChatModel | string): boolean {
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @llamaindex/perplexity
|
||||
|
||||
## 0.0.24
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [a8ec08c]
|
||||
- @llamaindex/core@0.6.16
|
||||
- @llamaindex/openai@0.4.11
|
||||
|
||||
## 0.0.23
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [856dd8c]
|
||||
- @llamaindex/openai@0.4.10
|
||||
|
||||
## 0.0.22
|
||||
|
||||
### Patch Changes
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user