Compare commits

...

27 Commits

Author SHA1 Message Date
github-actions[bot] 056594452c Release @llamaindex/readers@3.1.0 (#1880)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: marcusschiesser <17126+marcusschiesser@users.noreply.github.com>
2025-04-22 19:14:09 +07:00
Huu Le 1e59695cef Restructure reader packages (#1877)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2025-04-22 17:20:08 +07:00
Marcus Schiesser f463efd8a5 docs: fix agentic rag tutorial 2025-04-22 12:13:06 +02:00
Alex Yang cf95af40d9 make docs great again - 2nd time (#1876) 2025-04-21 15:07:16 -07:00
Alex Yang ddc910dc73 docs: no validate links 2025-04-21 12:50:10 -07:00
Alex Yang f12af27760 docs: fix turbo.json 2025-04-21 12:35:31 -07:00
Alex Yang ffdbc8f5e8 docs: disable typedoc 2025-04-21 12:27:08 -07:00
Alex Yang ea8817f7e4 fix(docs): search page id (#1875) 2025-04-21 12:10:42 -07:00
Alex Yang 359698d04b docs: remove links on docs detail page 2025-04-21 09:53:26 -07:00
Huu Le b49fb24948 docs: fix search function on the documentation site is not working. (#1872) 2025-04-21 09:49:48 -07:00
Alex Yang 78841495aa docs: fix meta.json 2025-04-21 09:43:28 -07:00
Alex Yang c81dd21472 chore: bump llama-flow docs 2025-04-21 09:38:14 -07:00
Alex Yang 52868ea0f9 docs: remove llamacloud section (#1851) 2025-04-21 09:37:40 -07:00
Logan e0a730e44e docs: replace with llama-flow docs (#1874)
Co-authored-by: Alex Yang <himself65@outlook.com>
2025-04-21 09:37:27 -07:00
Alex Yang eda486bb52 chore: bump pnpm (#1871) 2025-04-21 09:25:48 -07:00
Alex Yang 10d9c708db ci: enable turbo cache (#1873) 2025-04-21 09:25:38 -07:00
Alex Yang 556027705e chore(docs): fix inputs 2025-04-21 04:13:46 -07:00
github-actions[bot] 588cd0f0b9 Release 0.10.2 (#1861)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: marcusschiesser <17126+marcusschiesser@users.noreply.github.com>
2025-04-18 17:14:21 +07:00
Huu Le 7ca9ddff86 feat: Add generate UI workflow to server (#1862)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
Co-authored-by: Thuc Pham <51660321+thucpn@users.noreply.github.com>
2025-04-18 16:59:44 +07:00
Thuc Pham 3310eaae29 chore: bump chat-ui 0.4.0 (#1868) 2025-04-18 15:33:08 +07:00
Peter Goldstein 96dac4ddfd feat: Add Gemini 2.5 Flash Preview (#1866) 2025-04-18 15:30:06 +07:00
Logan f9ee683593 docs: remove fake chat (#1867) 2025-04-17 17:14:38 -07:00
Peter Goldstein e5c3f95c6e Update o4-mini to allow reasoning parameters and exclude temperature (#1859) 2025-04-17 13:51:27 +07:00
Thuc Pham b155c8cf2c chore: make llamaindex as peer deps of server (#1860) 2025-04-17 13:50:28 +07:00
github-actions[bot] be6fead71a Release 0.10.1 (#1858)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: himself65 <14026360+himself65@users.noreply.github.com>
2025-04-16 19:15:34 -07:00
Peter Goldstein 96dd79853a Add o3 and o4-mini models (#1857) 2025-04-16 13:28:39 -07:00
Fuma Nama f49366c9af make docs great again (#1855)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
Co-authored-by: Alex Yang <himself65@outlook.com>
2025-04-16 11:19:25 -07:00
165 changed files with 5653 additions and 4522 deletions
@@ -8,6 +8,11 @@ on:
branches:
- main
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
TURBO_REMOTE_ONLY: true
jobs:
lint:
runs-on: ubuntu-latest
+5
View File
@@ -1,6 +1,11 @@
name: Publish Preview
on: [pull_request]
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ vars.TURBO_TEAM }}
TURBO_REMOTE_ONLY: true
jobs:
pre_release:
name: Pre Release
+23
View File
@@ -1,5 +1,28 @@
# @llamaindex/doc
## 0.2.14
### Patch Changes
- Updated dependencies [1e59695]
- @llamaindex/readers@3.1.0
## 0.2.13
### Patch Changes
- Updated dependencies [e5c3f95]
- @llamaindex/openai@0.3.4
- llamaindex@0.10.2
## 0.2.12
### Patch Changes
- Updated dependencies [96dd798]
- @llamaindex/openai@0.3.3
- llamaindex@0.10.1
## 0.2.11
### Patch Changes
+2
View File
@@ -0,0 +1,2 @@
// fallback for `fs` usage in `web-tree-sitter`
module.exports = {};
+6 -10
View File
@@ -1,5 +1,4 @@
import { createMDX } from "fumadocs-mdx/next";
import MonacoWebpackPlugin from "monaco-editor-webpack-plugin";
const withMDX = createMDX();
/** @type {import('next').NextConfig} */
@@ -16,7 +15,12 @@ const config = {
"twoslash",
"typescript",
],
webpack: (config, { isServer }) => {
turbopack: {
resolveAlias: {
fs: { browser: "./fallback.js" },
},
},
webpack: (config) => {
if (Array.isArray(config.target) && config.target.includes("web")) {
config.target = ["web", "es2020"];
}
@@ -28,14 +32,6 @@ const config = {
};
config.resolve.fallback ??= {};
config.resolve.fallback.fs = false;
if (!isServer) {
config.plugins.push(
new MonacoWebpackPlugin({
languages: ["typescript"],
filename: "static/[name].worker.js",
}),
);
}
config.resolve.alias["replicate"] = false;
return config;
},
+12 -10
View File
@@ -1,20 +1,21 @@
{
"name": "@llamaindex/doc",
"version": "0.2.11",
"version": "0.2.14",
"private": true,
"scripts": {
"postinstall": "fumadocs-mdx",
"prebuild": "pnpm run build:docs",
"build": "next build",
"dev": "next dev",
"dev": "next dev --turbo",
"start": "next start",
"postbuild": "tsx scripts/post-build.mts && tsx scripts/validate-links.mts",
"build:docs": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" typedoc && tsx scripts/generate-docs.mts",
"validate-links": "tsx scripts/validate-links.mts"
},
"dependencies": {
"@huggingface/transformers": "^3.5.0",
"@icons-pack/react-simple-icons": "^10.1.0",
"@llama-flow/docs": "0.0.3",
"@llama-flow/docs": "0.0.5",
"@llamaindex/chat-ui": "0.2.0",
"@llamaindex/cloud": "workspace:*",
"@llamaindex/core": "workspace:*",
@@ -23,6 +24,7 @@
"@llamaindex/readers": "workspace:*",
"@llamaindex/workflow": "workspace:*",
"@mdx-js/mdx": "^3.1.0",
"@monaco-editor/react": "^4.7.0",
"@number-flow/react": "^0.3.4",
"@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-icons": "^1.3.2",
@@ -40,9 +42,9 @@
"fumadocs-core": "^15.2.7",
"fumadocs-docgen": "^2.0.0",
"fumadocs-mdx": "^11.6.0",
"fumadocs-openapi": "^6.3.0",
"fumadocs-openapi": "^8.0.1",
"fumadocs-twoslash": "^3.1.1",
"fumadocs-typescript": "^3.1.0",
"fumadocs-typescript": "^4.0.2",
"fumadocs-ui": "^15.2.7",
"hast-util-to-jsx-runtime": "^2.3.2",
"llamaindex": "workspace:*",
@@ -52,7 +54,6 @@
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-icons": "^5.3.0",
"react-monaco-editor": "^0.56.2",
"react-use-measure": "^2.1.1",
"rehype-katex": "^7.0.1",
"remark-math": "^6.0.0",
@@ -64,6 +65,8 @@
"tailwindcss-animate": "^1.0.7",
"tree-sitter": "^0.22.1",
"tree-sitter-typescript": "^0.23.2",
"ts-morph": "^25.0.1",
"twoslash": "^0.3.1",
"use-stick-to-bottom": "^1.0.42",
"web-tree-sitter": "^0.24.4",
"zod": "^3.23.8"
@@ -79,7 +82,6 @@
"cross-env": "^7.0.3",
"fast-glob": "^3.3.2",
"gray-matter": "^4.0.3",
"monaco-editor-webpack-plugin": "^7.1.0",
"postcss": "^8.5.3",
"raw-loader": "^4.0.2",
"remark": "^15.0.1",
@@ -88,9 +90,9 @@
"remark-stringify": "^11.0.0",
"tailwindcss": "^4.0.9",
"tsx": "^4.19.3",
"typedoc": "0.27.4",
"typedoc-plugin-markdown": "^4.3.1",
"typedoc-plugin-merge-modules": "^6.1.0",
"typedoc": "0.28.3",
"typedoc-plugin-markdown": "^4.6.2",
"typedoc-plugin-merge-modules": " ^7.0.0",
"typescript": "^5.7.3"
}
}

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Before

Width:  |  Height:  |  Size: 236 KiB

After

Width:  |  Height:  |  Size: 236 KiB

Before

Width:  |  Height:  |  Size: 540 KiB

After

Width:  |  Height:  |  Size: 540 KiB

+18 -18
View File
@@ -1,27 +1,24 @@
import { generateFiles as openapiGenerateFiles } from "fumadocs-openapi";
import { generateFiles as typescriptGenerateFiles } from "fumadocs-typescript";
import {
createGenerator,
generateFiles as typescriptGenerateFiles,
} from "fumadocs-typescript";
import fs from "node:fs";
import * as path from "node:path";
import { rimrafSync } from "rimraf";
const generator = createGenerator();
const out = "./src/content/docs/cloud/api";
const apiRefOut = "./src/content/docs/api";
// clean generated files
rimrafSync(out, {
filter(v) {
return !v.endsWith("index.mdx") && !v.endsWith("meta.json");
return !v.endsWith("index.md") && !v.endsWith("meta.json");
},
});
void openapiGenerateFiles({
input: ["../../packages/cloud/openapi.json"],
output: "./src/content/docs/cloud/api",
groupBy: "tag",
});
void typescriptGenerateFiles({
input: ["./src/content/docs/api/**/*.mdx"],
void typescriptGenerateFiles(generator, {
input: ["./src/content/docs/api/**/*.md"],
output: (file) => path.resolve(path.dirname(file), path.basename(file)),
transformOutput,
});
@@ -30,19 +27,22 @@ function transformOutput(filePath: string, content: string) {
const fileName = path.basename(filePath);
let title = fileName.split(".")[0];
if (title === "index") title = "LlamaIndex API Reference";
return `---\ntitle: ${title}\n---\n\n${transformAbsoluteUrl(content, filePath)}`;
return `---\ntitle: ${title}\n---\n\n${transformAbsoluteUrl(
content.replace(/(?<!\\)\{([^}]+)(?<!\\)}/g, "\\{$1\\}"),
filePath,
)}`;
}
/**
* Transforms the content by converting relative MDX links to absolute docs API links
* Example: [text](../type-aliases/TaskHandler.mdx) -> [text](/docs/api/type-aliases/TaskHandler)
* [text](BaseChatEngine.mdx) -> [text](/docs/api/classes/BaseChatEngine)
* [text](BaseVectorStore.mdx#constructors) -> [text](/docs/api/classes/BaseVectorStore#constructors)
* [text](TaskStep.mdx) -> [text](/docs/api/type-aliases/TaskStep)
* Transforms the content by converting relative MD links to absolute docs API links
* Example: [text](../type-aliases/TaskHandler.md) -> [text](/docs/api/type-aliases/TaskHandler)
* [text](BaseChatEngine.md) -> [text](/docs/api/classes/BaseChatEngine)
* [text](BaseVectorStore.md#constructors) -> [text](/docs/api/classes/BaseVectorStore#constructors)
* [text](TaskStep.md) -> [text](/docs/api/type-aliases/TaskStep)
*/
function transformAbsoluteUrl(content: string, filePath: string) {
const group = path.dirname(filePath).split(path.sep).pop();
return content.replace(/\]\(([^)]+)\.mdx([^)]*)\)/g, (_, slug, anchor) => {
return content.replace(/\]\(([^)]+)\.md([^)]*)\)/g, (_, slug, anchor) => {
const slugParts = slug.split("/");
const fileName = slugParts[slugParts.length - 1];
const fileGroup = slugParts[slugParts.length - 2] ?? group;
+4 -4
View File
@@ -28,14 +28,14 @@ interface RelativeLinkResult {
* Get all valid documentation routes from the content directory
*/
async function getValidRoutes(): Promise<Set<string>> {
const mdxFiles = await glob("**/*.mdx", { cwd: CONTENT_DIR });
const mdxFiles = await glob("**/*.mdx?", { cwd: CONTENT_DIR });
const routes = new Set<string>();
// Add each MDX file as a valid route
for (const file of mdxFiles) {
// Remove .mdx extension and normalize to route format
let route = file.replace(/\.mdx$/, "");
let route = file.replace(/\.mdx?$/, "");
// Handle index files
if (route.endsWith("/index")) {
@@ -131,7 +131,7 @@ function findRelativeLinksInFile(
* Find relative links in all MDX files
*/
async function findRelativeLinks(): Promise<RelativeLinkResult[]> {
const mdxFiles = await glob("**/*.mdx", { cwd: CONTENT_DIR });
const mdxFiles = await glob("**/*.mdx?", { cwd: CONTENT_DIR });
const results: RelativeLinkResult[] = [];
for (const file of mdxFiles) {
@@ -150,7 +150,7 @@ async function findRelativeLinks(): Promise<RelativeLinkResult[]> {
}
async function validateLinks(): Promise<LinkValidationResult[]> {
const mdxFiles = await glob("**/*.mdx", { cwd: CONTENT_DIR });
const mdxFiles = await glob("**/*.mdx?", { cwd: CONTENT_DIR });
const validRoutes = await getValidRoutes();
const results: LinkValidationResult[] = [];
+9 -7
View File
@@ -1,13 +1,18 @@
import { rehypeCodeDefaultOptions } from "fumadocs-core/mdx-plugins";
import {
rehypeCodeDefaultOptions,
remarkStructure,
} from "fumadocs-core/mdx-plugins";
import { fileGenerator, remarkDocGen, remarkInstall } from "fumadocs-docgen";
import { defineConfig, defineDocs } from "fumadocs-mdx/config";
import { transformerTwoslash } from "fumadocs-twoslash";
import { createFileSystemTypesCache } from "fumadocs-twoslash/cache-fs";
import rehypeKatex from "rehype-katex";
import remarkMath from "remark-math";
export const docs = defineDocs({
dir: ["./src/content/docs", "./node_modules/@llama-flow/docs"],
docs: {
async: true,
},
});
export default defineConfig({
@@ -21,11 +26,7 @@ export default defineConfig({
},
transformers: [
...(rehypeCodeDefaultOptions.transformers ?? []),
transformerTwoslash({
typesCache: createFileSystemTypesCache({
dir: ".next/cache/twoslash",
}),
}),
transformerTwoslash(),
{
name: "transformers:remove-notation-escape",
code(hast) {
@@ -46,6 +47,7 @@ export default defineConfig({
],
},
remarkPlugins: [
remarkStructure,
remarkMath,
[remarkInstall, { persist: { id: "package-manager" } }],
[remarkDocGen, { generators: [fileGenerator()] }],
+49 -65
View File
@@ -10,16 +10,55 @@ import { MagicMove } from "@/components/magic-move";
import { NpmInstall } from "@/components/npm-install";
import { Supports } from "@/components/supports";
import { Button } from "@/components/ui/button";
import { Skeleton } from "@/components/ui/skeleton";
import { DOCUMENT_URL } from "@/lib/const";
import { SiStackblitz } from "@icons-pack/react-simple-icons";
import {
CodeBlock as FumaCodeBlock,
Pre,
} from "fumadocs-ui/components/codeblock";
import { Blocks, Bot, Footprints, Terminal } from "lucide-react";
import Link from "next/link";
import { Suspense } from "react";
const codes = [
`import { openai } from "@llamaindex/openai";
const llm = openai();
const response = await llm.complete({ prompt: "How are you?" });`,
`import { openai } from "@llamaindex/openai";
const llm = openai();
const response = await llm.chat({
messages: [{ content: "Tell me a joke.", role: "user" }],
});`,
`import { agent } from "llamaindex";
import { openai } from "@llamaindex/openai";
const analyseAgent = agent({
llm: openai({ model: "gpt-4o" }),
tools: [analyseTools],
systemPrompt,
});
const response = await analyseAgent.run(\`Analyse the given data:
\${data}\`);`,
`import { agent, multiAgent } from "llamaindex";
import { openai } from "@llamaindex/openai";
const analyseAgent = agent({
name: "AnalyseAgent",
llm: openai({ model: "gpt-4o" }),
tools: [analyseTools],
});
const reporterAgent = agent({
name: "ReporterAgent",
llm: openai({ model: "gpt-4o" }),
tools: [reporterTools],
canHandoffTo: [analyseAgent],
});
const agents = multiAgent({
agents: [analyseAgent, reporterAgent],
rootAgent: reporterAgent,
});
const response = await agents.run(\`Analyse the given data:
\${data}\`);`,
];
export default function HomePage() {
return (
@@ -62,65 +101,10 @@ export default function HomePage() {
heading="From the simplest to the most complex"
description="LlamaIndex.TS is designed to be simple to get started, but powerful enough to build complex, agentic AI applications using multi-agents."
>
<Suspense
fallback={
<FumaCodeBlock allowCopy={false}>
<Pre>
<div className="space-y-2">
<Skeleton className="h-4 w-[250px]" />
<Skeleton className="h-4 w-[200px]" />
</div>
</Pre>
</FumaCodeBlock>
}
>
<MagicMove
code={[
`import { openai } from "@llamaindex/openai";
const llm = openai();
const response = await llm.complete({ prompt: "How are you?" });`,
`import { openai } from "@llamaindex/openai";
const llm = openai();
const response = await llm.chat({
messages: [{ content: "Tell me a joke.", role: "user" }],
});`,
`import { agent } from "llamaindex";
import { openai } from "@llamaindex/openai";
const analyseAgent = agent({
llm: openai({ model: "gpt-4o" }),
tools: [analyseTools],
systemPrompt,
});
const response = await analyseAgent.run(\`Analyse the given data:
\${data}\`);`,
`import { agent, multiAgent } from "llamaindex";
import { openai } from "@llamaindex/openai";
const analyseAgent = agent({
name: "AnalyseAgent",
llm: openai({ model: "gpt-4o" }),
tools: [analyseTools],
});
const reporterAgent = agent({
name: "ReporterAgent",
llm: openai({ model: "gpt-4o" }),
tools: [reporterTools],
canHandoffTo: [analyseAgent],
});
const agents = multiAgent({
agents: [analyseAgent, reporterAgent],
rootAgent: reporterAgent,
});
const response = await agents.run(\`Analyse the given data:
\${data}\`);`,
]}
/>
</Suspense>
<MagicMove
placeholder={<CodeBlock lang="ts" code={codes[0]} />}
code={codes}
/>
</Feature>
<Feature
icon={Bot}
+9 -1
View File
@@ -1,4 +1,12 @@
import { source } from "@/lib/source";
import { structure } from "fumadocs-core/mdx-plugins";
import { createFromSource } from "fumadocs-core/search/server";
export const { GET } = createFromSource(source);
// TODO: migrate to another search service, I don't think Vercel can handle that many of documents.
export const { GET } = createFromSource(source, (page) => ({
id: page.file.path,
title: page.data.title,
description: page.data.description,
url: page.url,
structuredData: structure(page.data.content),
}));
+21 -7
View File
@@ -1,7 +1,13 @@
import { ChatDemoRSC } from "@/components/demo/chat/rsc/demo";
import * as demos from "@/components/demo/lazy";
import { createMetadata, metadataImage } from "@/lib/metadata";
import { openapi, source } from "@/lib/source";
import * as Icons from "@icons-pack/react-simple-icons";
import { APIPage } from "fumadocs-openapi/ui";
import { Popup, PopupContent, PopupTrigger } from "fumadocs-twoslash/ui";
import { createTypeTable } from "fumadocs-typescript/ui";
import { createGenerator } from "fumadocs-typescript";
import { AutoTypeTable } from "fumadocs-typescript/ui";
import { Accordion, Accordions } from "fumadocs-ui/components/accordion";
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
import defaultMdxComponents from "fumadocs-ui/mdx";
import {
@@ -12,6 +18,8 @@ import {
} from "fumadocs-ui/page";
import { notFound } from "next/navigation";
const generator = createGenerator();
export const revalidate = false;
export default async function Page(props: {
@@ -21,14 +29,13 @@ export default async function Page(props: {
const page = source.getPage(params.slug);
if (!page) notFound();
const { AutoTypeTable } = createTypeTable();
const MDX = page.data.body;
const { body: MDX, toc, lastModified } = await page.data.load();
return (
<DocsPage
toc={page.data.toc}
toc={toc}
full={page.data.full}
lastUpdate={page.data.lastModified}
lastUpdate={lastModified}
editOnGithub={{
owner: "run-llama",
repo: "LlamaIndexTS",
@@ -41,14 +48,21 @@ export default async function Page(props: {
<DocsBody>
<MDX
components={{
...Icons,
...defaultMdxComponents,
APIPage: openapi.APIPage,
...demos,
ChatDemoRSC,
Accordion,
Accordions,
APIPage: (props) => <APIPage {...openapi.getAPIPageProps(props)} />,
Tab,
Tabs,
Popup,
PopupContent,
PopupTrigger,
AutoTypeTable,
AutoTypeTable: (props) => (
<AutoTypeTable generator={generator} {...props} />
),
}}
/>
</DocsBody>
+1 -19
View File
@@ -1,11 +1,7 @@
import { baseOptions } from "@/app/layout.config";
import { AITrigger } from "@/components/ai-chat";
import { buttonVariants } from "@/components/ui/button";
import { source } from "@/lib/source";
import { cn } from "@/lib/utils";
import "fumadocs-twoslash/twoslash.css";
import { DocsLayout } from "fumadocs-ui/layouts/docs";
import { MessageCircle } from "lucide-react";
import type { ReactNode } from "react";
export default function Layout({ children }: { children: ReactNode }) {
@@ -13,23 +9,9 @@ export default function Layout({ children }: { children: ReactNode }) {
<DocsLayout
tree={source.pageTree}
{...baseOptions}
links={[]}
nav={{
...baseOptions.nav,
children: (
<AITrigger
className={cn(
buttonVariants({
variant: "secondary",
size: "xs",
className:
"text-fd-muted-foreground ms-2 gap-1.5 rounded-full px-2 md:flex-1",
}),
)}
>
<MessageCircle className="size-3" />
Ask LlamaCloud
</AITrigger>
),
}}
>
{children}
+11 -1
View File
@@ -27,9 +27,19 @@ export const baseOptions: BaseLayoutProps = {
githubUrl: "https://github.com/run-llama/LlamaIndexTS",
links: [
{
text: "Docs",
text: "TypeScript",
url: DOCUMENT_URL,
active: "nested-url",
},
{
text: "Python",
url: "https://docs.llamaindex.ai",
active: "url",
},
{
text: "LlamaCloud",
url: "https://docs.cloud.llamaindex.ai/",
active: "url",
},
],
};
+1 -5
View File
@@ -13,11 +13,7 @@ import remarkStringify from "remark-stringify";
export const revalidate = false;
export async function GET() {
const files = await fg([
"./src/content/docs/**/*.mdx",
// remove generated openapi files
"!./src/content/docs/cloud/api/**/*",
]);
const files = await fg(["./src/content/docs/**/*.mdx"]);
const scan = files.map(async (file) => {
const fileContent = await fs.readFile(file);
@@ -1,24 +1,26 @@
"use client";
import { createContextState } from "foxact/context-state";
import { useIsClient } from "foxact/use-is-client";
import { CodeBlock, Pre } from "fumadocs-ui/components/codeblock";
import { lazy, Suspense, use, useMemo } from "react";
import { StickToBottom, useStickToBottomContext } from "use-stick-to-bottom";
import Parser from "web-tree-sitter";
import { Label } from "@/components/ui/label";
import { Skeleton } from "@/components/ui/skeleton";
import { Slider } from "@/components/ui/slider";
import { CodeSplitter } from "@llamaindex/node-parser/code";
import { Editor } from "@monaco-editor/react";
import { createContextState } from "foxact/context-state";
import { useIsClient } from "foxact/use-is-client";
import { useShiki } from "fumadocs-core/highlight/client";
import { CodeBlock, Pre } from "fumadocs-ui/components/codeblock";
import { Suspense, use, useMemo } from "react";
import { StickToBottom, useStickToBottomContext } from "use-stick-to-bottom";
let promise: Promise<CodeSplitter>;
if (typeof window !== "undefined") {
promise = Parser.init({
locateFile(scriptName: string) {
return "/" + scriptName;
},
}).then(async () => {
async function run() {
const { default: Parser } = await import("web-tree-sitter");
await Parser.init({
locateFile(scriptName: string) {
return "/" + scriptName;
},
});
const parser = new Parser();
const Lang = await Parser.Language.load("/tree-sitter-typescript.wasm");
parser.setLanguage(Lang);
@@ -26,7 +28,9 @@ if (typeof window !== "undefined") {
getParser: () => parser,
maxChars: 100,
});
});
}
promise = run();
}
const [SliderProvider, useSlider, useSetSlider] = createContextState(100);
@@ -48,8 +52,6 @@ const john: Person = {
console.log(greet(john));`);
const Editor = lazy(() => import("react-monaco-editor"));
export const IDE = () => {
const codeSplitter = use(promise);
const code = useCode();
@@ -73,21 +75,6 @@ export const IDE = () => {
/>
</div>
<Editor
editorWillMount={() => {}}
editorDidMount={() => {
window.MonacoEnvironment!.getWorkerUrl = (
_moduleId: string,
label: string,
) => {
if (label === "json") return "/_next/static/json.worker.js";
if (label === "css") return "/_next/static/css.worker.js";
if (label === "html") return "/_next/static/html.worker.js";
if (label === "typescript" || label === "javascript")
return "/_next/static/ts.worker.js";
return "/_next/static/editor.worker.js";
};
}}
editorWillUnmount={() => {}}
options={{
minimap: {
enabled: false,
@@ -97,7 +84,9 @@ export const IDE = () => {
height="100%"
width="100%"
language="typescript"
onChange={setCode}
onChange={(v) => {
if (v) setCode(v);
}}
value={code}
/>
</div>
+18
View File
@@ -0,0 +1,18 @@
"use client";
import dynamic from "next/dynamic";
// lazy load client components
export const ChatDemo = dynamic(() =>
import("@/components/demo/chat/api/demo").then((mod) => mod.ChatDemo),
);
export const CodeNodeParserDemo = dynamic(() =>
import("@/components/demo/code-node-parser").then(
(mod) => mod.CodeNodeParserDemo,
),
);
export const WorkflowStreamingDemo = dynamic(() =>
import("@/components/demo/workflow-streaming-ui").then(
(mod) => mod.WorkflowStreamingDemo,
),
);
+26 -21
View File
@@ -1,25 +1,27 @@
"use client";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
import { CodeBlock, Pre } from "fumadocs-ui/components/codeblock";
import { CodeBlock } from "fumadocs-ui/components/codeblock";
import { RotateCcw } from "lucide-react";
import { useTheme } from "next-themes";
import { use, useCallback, useEffect, useState } from "react";
import { getSingletonHighlighter } from "shiki";
import { type ReactNode, use, useCallback, useEffect, useState } from "react";
import { createJavaScriptRegexEngine, getSingletonHighlighter } from "shiki";
import { ShikiMagicMove } from "shiki-magic-move/react";
import { createOnigurumaEngine } from "shiki/engine/oniguruma";
const engine = createJavaScriptRegexEngine();
const highlighterPromise = getSingletonHighlighter({
engine: createOnigurumaEngine(() => import("shiki/wasm")),
engine,
themes: ["vesper", "github-light"],
langs: ["js", "ts", "tsx"],
});
export type MagicMoveProps = {
code: string[];
placeholder: ReactNode;
};
export function MagicMove(props: MagicMoveProps) {
const [mounted, setMounted] = useState(false);
const [move, setMove] = useState<number>(0);
const currentCode = props.code[move];
const highlighter = use(highlighterPromise);
@@ -38,24 +40,27 @@ export function MagicMove(props: MagicMoveProps) {
}
}, [animate, move, props.code]);
useEffect(() => {
setMounted(true);
}, []);
if (!mounted) return props.placeholder;
return (
<CodeBlock allowCopy={false}>
{highlighter && (
<Pre>
<ShikiMagicMove
lang="ts"
theme={resolvedTheme === "dark" ? "vesper" : "github-light"}
highlighter={highlighter}
code={currentCode}
options={{
duration: 800,
stagger: 0.3,
lineNumbers: false,
containerStyle: false,
}}
/>
</Pre>
)}
<ShikiMagicMove
className="shiki !block p-4 *:!inline"
lang="ts"
theme={resolvedTheme === "dark" ? "vesper" : "github-light"}
highlighter={highlighter}
code={currentCode}
options={{
duration: 800,
stagger: 0.3,
lineNumbers: false,
containerStyle: false,
}}
/>
<Button
className={cn(
"absolute bottom-2 right-2",
@@ -1,8 +0,0 @@
---
title: LlamaCloud
description: LlamaCloud is a new generation of managed parsing, ingestion, and retrieval services, designed to bring production-grade context-augmentation to your LLM and RAG applications.
---
This is TypeScript binding for LlamaCloud API. It provides a simple way to interact with LlamaCloud API.
If you are looking for the official documentation, please visit the [Official Document](https://docs.cloud.llamaindex.ai/)
@@ -1,6 +0,0 @@
{
"title": "LlamaCloud",
"description": "The Cloud framework for LLM",
"root": true,
"pages": ["---Guide---", "index", "..."]
}
@@ -18,4 +18,4 @@ 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:
![create-llama interface](./images/create_llama.png)
![create-llama interface](/images/create_llama.png)
@@ -3,13 +3,6 @@ title: With Cloudflare Worker
description: In this guide, you'll learn how to use LlamaIndex with CloudFlare Worker
---
import {
SiNodedotjs,
SiDeno,
SiBun,
SiCloudflareworkers,
} from "@icons-pack/react-simple-icons";
Before you start, make sure you have try LlamaIndex.TS in Node.js to make sure you understand the basics.
<Card
@@ -3,14 +3,6 @@ title: Installation
description: How to install llamaindex packages.
---
import {
SiNodedotjs,
SiTypescript,
SiNextdotjs,
SiCloudflareworkers,
SiVite
} from "@icons-pack/react-simple-icons";
To install llamaindex, run the following command:
```package-install
@@ -3,13 +3,6 @@ title: What is LlamaIndex.TS
description: LlamaIndex is the leading data framework for building LLM applications
---
import {
SiNodedotjs,
SiDeno,
SiBun,
SiCloudflareworkers,
} from "@icons-pack/react-simple-icons";
LlamaIndex is a framework for building context-augmented generative AI applications with LLMs including agents and workflows.
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.
@@ -2,9 +2,6 @@
title: Workflows
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!@/examples/workflow/joke.ts";
A `Workflow` in LlamaIndexTS is an event-driven abstraction used to chain together several events. Workflows are made up of `steps`, with each step responsible for handling certain event types and emitting new events.
Workflows in LlamaIndexTS work by defining step functions that handle specific event types and emit new events.
@@ -22,7 +19,7 @@ npm i @llamaindex/workflow
As an illustrative example, let's consider a naive workflow where a joke is generated and then critiqued.
<DynamicCodeBlock lang="ts" code={CodeSource} />
<include cwd>../../examples/workflow/joke.ts</include>
There's a few moving pieces here, so let's go through this piece by piece.
@@ -3,10 +3,6 @@ title: Managed Index
description: Managed index using LlamaCloud
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!@/examples/cloud/chat.ts";
import CodeSource2 from "!raw-loader!@/examples/cloud/from-documents.ts";
LlamaCloud is a new generation of managed parsing, ingestion, and retrieval services, designed to bring production-grade context-augmentation to your LLM and RAG applications.
LlamaCloud supports
@@ -22,13 +18,13 @@ Visit [LlamaCloud](https://cloud.llamaindex.ai) to sign in and get an API key.
Here's an example of how to create a managed index by ingesting a couple of documents:
<DynamicCodeBlock lang="ts" code={CodeSource2} />
<include cwd>../../examples/cloud/chat.ts</include>
## Use a Managed Index
Here's an example of how to use a managed index together with a chat engine:
<DynamicCodeBlock lang="ts" code={CodeSource} />
<include cwd>../../examples/cloud/from-documents.ts</include>
## API Reference
@@ -2,7 +2,6 @@
title: Node Parsers / Text Splitters
description: Learn how to use Node Parsers and Text Splitters to extract data from documents.
---
import { CodeNodeParserDemo } from '@/components/demo/code-node-parser.tsx';
Node parsers are a simple abstraction that take a list of `Document` objects, and chunk them into `Node` objects, such that each node is a specific chunk of the parent document. When a document is broken into nodes, all of it's attributes are inherited to the children nodes (i.e. `metadata`, text and metadata templates, etc.). You can read more about `Node` and `Document` properties [here](/docs/llamaindex/modules/data).
@@ -150,8 +149,6 @@ Try it out ⬇️
<CodeNodeParserDemo/>
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
<Accordions>
<Accordion title="Use it in browser">
You might setup WASM files for `web-tree-sitter` and use it in the browser.
@@ -2,12 +2,15 @@
title: DiscordReader
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!@/examples/readers/src/discord";
DiscordReader is a simple data loader that reads all messages in a given Discord channel and returns them as Document objects.
It uses the [@discordjs/rest](https://github.com/discordjs/discord.js/tree/main/packages/rest) library to fetch the messages.
## Installation
```package-install
npm install @llamaindex/discord
```
## Usage
First step is to create a Discord Application and generating a bot token [here](https://discord.com/developers/applications).
@@ -15,7 +18,7 @@ In your Discord Application, go to the `OAuth2` tab and generate an invite URL b
This will invite the bot with the necessary permissions to read messages.
Copy the URL in your browser and select the server you want your bot to join.
<DynamicCodeBlock lang="ts" code={CodeSource} />
<include cwd>../../examples/discord/reader.ts</include>
### Params
@@ -3,11 +3,6 @@ title: Loading Data
description: Loading data using Readers into Documents
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!@/examples/readers/src/simple-directory-reader";
import CodeSource2 from "!raw-loader!@/examples/readers/src/custom-simple-directory-reader";
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
Before you can start indexing your documents, you need to load them into memory.
A reader is a module that loads data from a file into a `Document` object.
@@ -26,27 +21,18 @@ To install readers call:
We offer readers for different file formats.
```ts twoslash
import { CSVReader } from '@llamaindex/readers/csv'
import { PDFReader } from '@llamaindex/readers/pdf'
import { JSONReader } from '@llamaindex/readers/json'
import { MarkdownReader } from '@llamaindex/readers/markdown'
import { HTMLReader } from '@llamaindex/readers/html'
// you can find more readers in the documentation
```ts twoslash
import { CSVReader } from '@llamaindex/readers/csv';
import { DocxReader } from '@llamaindex/readers/docx';
import { HTMLReader } from '@llamaindex/readers/html';
import { ImageReader } from '@llamaindex/readers/image';
import { JSONReader } from '@llamaindex/readers/json';
import { MarkdownReader } from '@llamaindex/readers/markdown';
import { ObsidianReader } from '@llamaindex/readers/obsidian';
import { PDFReader } from '@llamaindex/readers/pdf';
import { TextFileReader } from '@llamaindex/readers/text';
```
Additionally the following loaders exist without separate documentation:
- `AssemblyAIReader` transcribes audio using [AssemblyAI](https://www.assemblyai.com/).
- [AudioTranscriptReader](/docs/api/classes/AudioTranscriptReader): loads entire transcript as a single document.
- [AudioTranscriptParagraphsReader](/docs/api/classes/AudioTranscriptParagraphsReader): creates a document per paragraph.
- [AudioTranscriptSentencesReader](/docs/api/classes/AudioTranscriptSentencesReader): creates a document per sentence.
- [AudioSubtitlesReader](/docs/api/classes/AudioTranscriptParagraphsReader): creates a document containing the subtitles of a transcript.
- [NotionReader](/docs/api/classes/NotionReader) loads [Notion](https://www.notion.so/) pages.
- [SimpleMongoReader](/docs/api/classes/SimpleMongoReader) loads data from a [MongoDB](https://www.mongodb.com/).
Check the [LlamaIndexTS Github](https://github.com/run-llama/LlamaIndexTS) for the most up to date overview of integrations.
## SimpleDirectoryReader
[Open in StackBlitz](https://stackblitz.com/github/run-llama/LlamaIndexTS/tree/main/examples/readers?file=src/simple-directory-reader.ts&title=Simple%20Directory%20Reader)
@@ -55,7 +41,7 @@ LlamaIndex.TS supports easy loading of files from folders using the `SimpleDirec
It is a simple reader that reads all files from a directory and its subdirectories and delegates the actual reading to the reader specified in the `fileExtToReader` map.
<DynamicCodeBlock lang="ts" code={CodeSource} />
<include cwd>../../examples/readers/src/simple-directory-reader.ts</include>
Currently, the following readers are mapped to specific file types:
@@ -77,7 +63,7 @@ SimpleDirectoryReader supports up to 9 concurrent requests. Use the `numWorkers`
### Example
<DynamicCodeBlock lang="ts" code={CodeSource2} />
<include cwd>../../examples/readers/src/custom-simple-directory-reader.ts</include>
## Tips when using in non-Node.js environments
@@ -112,6 +112,3 @@ The returned `imageDocs` have the alt text assigned as text and the image path a
You can see the full example file [here](https://github.com/run-llama/LlamaIndexTS/blob/main/examples/readers/src/llamaparse-json.ts).
## API Reference
- [LlamaParseReader](/docs/api/classes/LlamaParseReader)
@@ -2,10 +2,6 @@
title: LlamaParse
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!@/examples/readers/src/llamaparse";
import CodeSource2 from "!raw-loader!@/examples/readers/src/simple-directory-reader-with-llamaparse.ts";
LlamaParse is an API created by LlamaIndex to efficiently parse files, e.g. it's great at converting PDF tables into markdown.
To use it, first login and get an API key from https://cloud.llamaindex.ai. Make sure to store the key as `apiKey` parameter or in the environment variable `LLAMA_CLOUD_API_KEY`.
@@ -17,7 +13,7 @@ Official documentation for LlamaParse can be found [here](https://docs.cloud.lla
You can then use the `LlamaParseReader` class to load local files and convert them into a parsed document that can be used by LlamaIndex.
See [reader.ts](https://github.com/run-llama/LlamaIndexTS/blob/main/packages/cloud/src/reader.ts) for a list of supported file types:
<DynamicCodeBlock lang="ts" code={CodeSource} />
<include cwd>../../examples/readers/src/llamaparse.ts</include>
### Params
@@ -36,7 +32,7 @@ They can be divided into two groups.
#### Advanced params:
- `resultType` can be set to `markdown`, `text` or `json`. Defaults to `text`. More information about `json` mode on the next pages.
- `language` primarily helps with OCR recognition. Defaults to `en`. Click [here](/docs/api/type-aliases/Language) for a list of supported languages.
- `language` primarily helps with OCR recognition. Defaults to `en`.
- `parsingInstructions?` Optional. Can help with complicated document structures. See this [LlamaIndex Blog Post](https://www.llamaindex.ai/blog/launching-the-first-genai-native-document-parsing-platform) for an example.
- `skipDiagonalText?` Optional. Set to true to ignore diagonal text. (Text that is not rotated 0, 90, 180 or 270 degrees)
- `invalidateCache?` Optional. Set to true to ignore the LlamaCloud cache. All document are kept in cache for 48hours after the job was completed to avoid processing the same document twice. Can be useful for testing when trying to re-parse the same document with, e.g. different `parsingInstructions`.
@@ -60,9 +56,8 @@ They can be divided into two groups.
Below a full example of `LlamaParse` integrated in `SimpleDirectoryReader` with additional options.
<DynamicCodeBlock lang="ts" code={CodeSource2} />
<include cwd>../../examples/readers/src/simple-directory-reader-with-llamaparse.ts</include>
## API Reference
- [SimpleDirectoryReader](/docs/api/classes/SimpleDirectoryReader)
- [LlamaParseReader](/docs/api/classes/LlamaParseReader)
@@ -98,5 +98,4 @@ You can assign any other values of the JSON response to the Document as needed.
## API Reference
- [LlamaParseReader](/docs/api/classes/LlamaParseReader)
- [SimpleDirectoryReader](/docs/api/classes/SimpleDirectoryReader)
@@ -2,9 +2,6 @@
title: Groq
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!@/examples/groq.ts";
## Installation
```package-install
@@ -58,7 +55,7 @@ const results = await queryEngine.query({
## Full Example
<DynamicCodeBlock lang="ts" code={CodeSource} />
<include cwd>../../examples/groq.ts</include>
## API Reference
@@ -2,7 +2,6 @@
title: Using API Route
description: Chat interface for your LlamaIndexTS application using API Route
---
import { ChatDemo } from '../../../../../components/demo/chat/api/demo';
Using [chat-ui](https://github.com/run-llama/chat-ui), it's easy to add a chat interface to your LlamaIndexTS application.
You just need to create an API route that provides an `api/chat` endpoint and a chat component to consume the API.
@@ -22,7 +22,7 @@ npm i @llamaindex/server
## Quick Start
Create index.ts file and add the following code:
Create an `index.ts` file and add the following code:
```ts
import { LlamaIndexServer } from "@llamaindex/server";
@@ -43,20 +43,20 @@ new LlamaIndexServer({
In the same directory as `index.ts`, run the following command to start the server:
```bash
tsx index.ts
```
```bash
tsx index.ts
```
The server will start at `http://localhost:3000`
You can also make a request to the server:
```bash
curl -X POST "http://localhost:3000/api/chat" -H "Content-Type: application/json" -d '{"message": "Who is the first president of the United States?"}'
```
```bash
curl -X POST "http://localhost:3000/api/chat" -H "Content-Type: application/json" -d '{"message": "Who is the first president of the United States?"}'
```
## Configuration Options
The LlamaIndexServer accepts the following configuration
The `LlamaIndexServer` accepts the following configuration options:
- `workflow`: A callable function that creates a workflow instance for each request
- `uiConfig`: An object to configure the chat UI containing the following properties:
@@ -68,6 +68,72 @@ The LlamaIndexServer accepts the following configuration
LlamaIndexServer accepts all the configuration options from Nextjs Custom Server such as `port`, `hostname`, `dev`, etc.
See all Nextjs Custom Server options [here](https://nextjs.org/docs/app/building-your-application/configuring/custom-server).
## AI-generated UI Components
The LlamaIndex server provides support for rendering workflow events using custom UI components, allowing you to extend and customize the chat interface.
These components can be auto-generated using an LLM by providing a JSON schema of the workflow event.
### UI Event Schema
To display custom UI components, your workflow needs to emit UI events that have an event type for identification and a data object:
```typescript
class UIEvent extends WorkflowEvent<{
type: "ui_event";
data: UIEventData;
}> {}
```
The `data` object can be any JSON object. To enable AI generation of the UI component, you need to provide a schema for that data (here we're using Zod):
```typescript
const MyEventDataSchema = z.object({
stage: z.enum(["retrieve", "analyze", "answer"]).describe("The current stage the workflow process is in."),
progress: z.number().min(0).max(1).describe("The progress in percent of the current stage"),
}).describe("WorkflowStageProgress");
type UIEventData = z.infer<typeof MyEventDataSchema>;
```
### Generate UI Components
The `generateEventComponent` function uses an LLM to generate a custom UI component based on the JSON schema of a workflow event. The schema should contain accurate descriptions of each field so that the LLM can generate matching components for your use case. We've done this for you in the example above using the `describe` function from Zod:
```typescript
import { OpenAI } from "llamaindex";
import { generateEventComponent } from "@llamaindex/server";
import { MyEventDataSchema } from "./your-workflow";
// Also works well with Claude 3.5 Sonnet and Google Gemini 2.5 Pro
const llm = new OpenAI({ model: "gpt-4.1" });
const code = generateEventComponent(MyEventDataSchema, llm);
```
After generating the code, we need to save it to a file. The file name must match the event type from your workflow (e.g., `ui_event.jsx` for handling events with `ui_event` type):
```ts
fs.writeFileSync("components/ui_event.jsx", code);
```
Feel free to modify the generated code to match your needs. If you're not satisfied with the generated code, we suggest improving the provided JSON schema first or trying another LLM.
> Note that `generateEventComponent` is generating JSX code, but you can also provide a TSX file.
### Server Setup
To use the generated UI components, you need to initialize the LlamaIndex server with the `componentsDir` that contains your custom UI components:
```ts
new LlamaIndexServer({
workflow: createWorkflow,
uiConfig: {
appTitle: "LlamaIndex App",
componentsDir: "components",
},
}).start();
```
## Default Endpoints and Features
### Chat Endpoint
@@ -85,69 +151,19 @@ The server always provides a chat interface at the root path (`/`) with:
### Static File Serving
- The server automatically mounts the `data` and `output` folders at `{server_url}{api_prefix}/files/data` (default: `/api/files/data`) and `{server_url}{api_prefix}/files/output` (default: `/api/files/output`) respectively.
- Your workflows can use both folders to store and access files. As a convention, the `data` folder is used for documents that are ingested and the `output` folder is used for documents that are generated by the workflow.
- Your workflows can use both folders to store and access files. By convention, the `data` folder is used for documents that are ingested, and the `output` folder is used for documents generated by the workflow.
## Custom UI Components
The LlamaIndex server provides support for rendering workflow events using custom UI components, allowing you to extend and customize the chat interface.
### Overview
Custom UI components are a powerful feature that enables you to:
- Add custom interface elements to the chat UI using React JSX or TSX files
- Extend the default chat interface functionality
- Create specialized visualizations or interactions
### Configuration
Your workflow must emit events that fit this structure, allowing the LlamaIndex server to display the right UI components based on the event type.
```json
{
"type": "<event_name>",
"data": <data model>
}
```
### Server Setup
1. Initialize the LlamaIndex server with a component directory:
```ts
new LlamaIndexServer({
workflow: createWorkflow,
uiConfig: {
appTitle: "LlamaIndex App",
componentsDir: "components",
},
}).start();
```
2. Add the custom component code to the directory following the naming pattern:
- File Extension: `.jsx` and `.tsx` for React components
- File Name: Should match the event type from your workflow (e.g., `deep_research_event.jsx` for handling `deep_research_event` type that you defined in your workflow). If there are TSX and JSX files with the same name, the TSX file will be used.
- Component Name: Export a default React component named `Component` that receives props from the event data
Example component structure:
```jsx
function Component({ events }) {
// Your component logic here
return (
// Your UI code here
);
}
```
## Best Practices
1. Always provide a workflow factory that creates fresh workflow instances
2. Use environment variables for sensitive configuration
3. Use starter questions to guide users in the chat UI
1. Always provide a workflow factory that creates a fresh workflow instance for each request.
2. Use environment variables for sensitive configuration (e.g., API keys).
3. Use starter questions to guide users in the chat UI.
## Getting Started with a New Project
Want to start a new project with LlamaIndexServer? Check out our [create-llama](https://github.com/run-llama/create-llama) tool to quickly generate a new project with LlamaIndexServer.
Want to start a new project with LlamaIndexServer? Check out our [create-llama](https://github.com/run-llama/create-llama) tool to quickly generate a new project with LlamaIndexServer.
## API Reference
- [LlamaIndexServer](/docs/api/classes/LlamaIndexServer)
@@ -2,7 +2,6 @@
title: Using Next.js RSC
description: Chat interface for your LlamaIndexTS application using Next.js RSC
---
import { ChatDemoRSC } from '../../../../../components/demo/chat/rsc/demo';
Using [chat-ui](https://github.com/run-llama/chat-ui), it's easy to add a chat interface to your LlamaIndexTS application using [Next.js RSC](https://nextjs.org/docs/app/building-your-application/rendering/server-components) and [Vercel AI RSC](https://sdk.vercel.ai/docs/ai-sdk-rsc/overview).
@@ -3,13 +3,6 @@ title: More
description: More
---
import {
SiGithub,
SiNpm,
SiX,
SiDiscord,
} from "@icons-pack/react-simple-icons";
## 🗺️ Ecosystem
To download or contribute, find LlamaIndex on:
@@ -8,7 +8,7 @@ In this guide we'll walk you through the process of building an Agent in JavaScr
In LlamaIndex, an agent is a semi-autonomous piece of software powered by an LLM that is given a task and executes a series of steps towards solving that task. It is given a set of tools, which can be anything from arbitrary functions up to full LlamaIndex query engines, and it selects the best available tool to complete each step. When each step is completed, the agent judges whether the task is now complete, in which case it returns a result to the user, or whether it needs to take another step, in which case it loops back to the start.
![agent flow](./images/agent_flow.png)
![agent flow](/images/agent_flow.png)
## Install LlamaIndex.TS
@@ -58,25 +58,9 @@ We will convert our text into embeddings using the `VectorStoreIndex` class thro
const index = await VectorStoreIndex.fromDocuments(documents);
```
### Configure a retriever
Before LlamaIndex can send a query to the LLM, it needs to find the most relevant chunks to send. That's the purpose of a `Retriever`. We're going to get `VectorStoreIndex` to act as a retriever for us
```javascript
const retriever = await index.asRetriever();
```
### Configure how many documents to retrieve
By default LlamaIndex will retrieve just the 2 most relevant chunks of text. This document is complex though, so we'll ask for more context.
```javascript
retriever.similarityTopK = 10;
```
### Use index.queryTool
`index.queryTool` creates a `QueryEngineTool` that can be used be an agent to query data from the index.
`index.queryTool` creates a `QueryEngineTool` that can be used be an agent to query data from the index:
```javascript
const tools = [
@@ -85,9 +69,17 @@ const tools = [
name: "san_francisco_budget_tool",
description: `This tool can answer detailed questions about the individual components of the budget of San Francisco in 2023-2024.`,
},
options: { similarityTopK: 10 },
}),
];
```
The `metadata` that we're setting helps the agent to decide when to use the tool.
Note that by default LlamaIndex will retrieve just the 2 most relevant chunks of text. This document is complex though, so we'll ask for more context by setting `similarityTopK` to 10.
Now, we can create an agent using the `QueryEngineTool`:
```javascript
// Create an agent using the tools array
const ragAgent = agent({ tools });
@@ -12,6 +12,7 @@ const tools = [
name: "san_francisco_budget_tool",
description: `This tool can answer detailed questions about the individual components of the budget of San Francisco in 2023-2024.`,
},
options: { similarityTopK: 10 },
}),
tool({
name: "sumNumbers",
@@ -2,9 +2,6 @@
title: Basic Agent
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!@/examples/agent/openai";
We have a comprehensive, step-by-step [guide to building agents in LlamaIndex.TS](/docs/llamaindex/tutorials/agents/1_setup) that we recommend to learn what agents are and how to build them for production. But building a basic agent is simple:
## Set up
@@ -27,7 +24,7 @@ Create the file `example.ts`. This code will:
- Give an example of the data structure we wish to generate
- Prompt the LLM with instructions and the example, plus a sample transcript
<DynamicCodeBlock lang="ts" code={CodeSource} />
<include cwd>../../examples/agent/openai.ts</include>
To run the code:
@@ -4,7 +4,7 @@
"basic_agent",
"rag",
"agents",
"workflow",
"../../llamaflow",
"local_llm",
"chatbot",
"structured_data_extraction"
@@ -2,10 +2,6 @@
title: Retrieval Augmented Generation (RAG)
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!@/examples/vectorIndex";
import TSConfigSource from "!!raw-loader!@/examples/tsconfig.json";
One of the most common use-cases for LlamaIndex is Retrieval-Augmented Generation or RAG, in which your data is indexed and selectively retrieved to be given to an LLM as source material for responding to a query. You can learn more about the [concepts behind RAG](/docs/llamaindex/tutorials/rag/concepts).
## Set up the project
@@ -30,11 +26,11 @@ Create the file `example.ts`. This code will
- index it (which creates embeddings using OpenAI)
- create a query engine to answer questions about the data
<DynamicCodeBlock lang="ts" code={CodeSource} />
<include cwd>../../examples/vectorIndex.ts</include>
Create a `tsconfig.json` file in the same folder:
<DynamicCodeBlock lang="json" code={TSConfigSource} />
<include cwd>../../examples/tsconfig.json</include>
Now you can run the code with
@@ -2,9 +2,6 @@
title: Structured data extraction
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!@/examples/jsonExtract";
Make sure you have installed LlamaIndex.TS and have an OpenAI key. If you haven't, check out the [installation](/docs/llamaindex/getting_started/installation) guide.
You can use [other LLMs](/docs/llamaindex/modules/models/llms) via their APIs; if you would prefer to use local models check out our [local LLM example](/docs/llamaindex/tutorials/local_llm).
@@ -26,7 +23,7 @@ Create the file `example.ts`. This code will:
- Give an example of the data structure we wish to generate
- Prompt the LLM with instructions and the example, plus a sample transcript
<DynamicCodeBlock lang="ts" code={CodeSource} />
<include cwd>../../examples/jsonExtract.ts</include>
To run the code:
@@ -1,226 +0,0 @@
---
title: Inputs / Outputs
description: Learn how to use different inputs and outputs in your workflows.
---
Inputs and outputs are the way to communicate between steps in a workflow. In the previous example,
we used `StartEvent` and `StopEvent` to communicate between steps. However, you can use any type of event to communicate between steps.
## Multiple inputs
You can define multiple inputs for a step.
In the following example, we define a complex workflow with multiple inputs and outputs.
```ts twoslash
import { Workflow, StartEvent, StopEvent, WorkflowEvent } from '@llamaindex/workflow';
class AEvent extends WorkflowEvent<string> {
constructor(data: string) {
super(data);
}
}
class BEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
class ResultEvent extends WorkflowEvent<string> {
constructor(data: string) {
super(data);
}
}
```
First, let's define the events that we will use in the workflow.
```ts twoslash
import { Workflow, StartEvent, StopEvent, WorkflowEvent } from '@llamaindex/workflow';
class AEvent extends WorkflowEvent<string> {
constructor(data: string) {
super(data);
}
}
class BEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
class ResultEvent extends WorkflowEvent<string> {
constructor(data: string) {
super(data);
}
}
const workflow = new Workflow<never, string, string>();
workflow.addStep({
inputs: [StartEvent<string>],
outputs: [StopEvent<string>]
}, async (
context,
startEvent
) => {
const input = startEvent.data;
const aEvent = await context.requireEvent(AEvent);
const bEvent = await context.requireEvent(BEvent);
const a = aEvent.data;
const b = bEvent.data;
return new StopEvent(`Hello, ${input}! A: ${a}, B: ${b}`);
});
// ---cut---
workflow.addStep({
inputs: [AEvent, BEvent],
outputs: [ResultEvent]
}, async (
context,
aEvent,
bEvent
) => {
const a = aEvent.data;
const b = bEvent.data;
return new ResultEvent(`A: ${a}, B: ${b}`);
});
```
This step means that it requires two events: `AEvent` and `BEvent`. It will return a `ResultEvent` with the data `A: ${a}, B: ${b}`.
## A or B input
If we want to have a step that can accept either `AEvent` or `BEvent`, we can define the step like this:
```ts twoslash
import { Workflow, StartEvent, StopEvent, WorkflowEvent } from '@llamaindex/workflow';
class AEvent extends WorkflowEvent<string> {
constructor(data: string) {
super(data);
}
}
class BEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
class ResultEvent extends WorkflowEvent<string> {
constructor(data: string) {
super(data);
}
}
const workflow = new Workflow<never, string, string>();
workflow.addStep({
inputs: [StartEvent<string>],
outputs: [StopEvent<string>]
}, async (
context,
startEvent
) => {
const input = startEvent.data;
const aEvent = await context.requireEvent(AEvent);
const bEvent = await context.requireEvent(BEvent);
const a = aEvent.data;
const b = bEvent.data;
return new StopEvent(`Hello, ${input}! A: ${a}, B: ${b}`);
});
// ---cut---
workflow.addStep({
inputs: [WorkflowEvent.or(AEvent, BEvent)],
outputs: [ResultEvent]
}, async (
context,
aOrBEvent
) => {
if (aOrBEvent instanceof AEvent) {
// ^?
const a = aOrBEvent.data;
// ^?
return new ResultEvent(`A: ${a}`);
} else {
const b = aOrBEvent.data;
// ^?
return new ResultEvent(`B: ${b}`);
}
});
```
This step means that it requires either `AEvent` or `BEvent`. It will return a `ResultEvent` with the data `A: ${a}` or `B: ${b}`.
You can still combine the logic with `context.requireEvent` to get the data from the event.
import { Accordion, Accordions } from 'fumadocs-ui/components/accordion';
<Accordions>
<Accordion title="Under the hood">
We use JavaScript Inheritance and the prototype chain to implement the `or` logic.
The `or` method creates a new class that extends the two classes that you pass to it.
<a
target="_blank"
href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain"
>
MDN - Inheritance and the prototype chain
</a>
</Accordion>
</Accordions>
## Multiple outputs
You can define multiple outputs for a step.
```ts twoslash
import { Workflow, StartEvent, StopEvent, WorkflowEvent } from '@llamaindex/workflow';
class AEvent extends WorkflowEvent<string> {
constructor(data: string) {
super(data);
}
}
class BEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
class ResultEvent extends WorkflowEvent<string> {
constructor(data: string) {
super(data);
}
}
const workflow = new Workflow<never, string, string>();
// ---cut---
workflow.addStep({
inputs: [StartEvent<string>],
outputs: [AEvent, BEvent]
}, async (
context,
startEvent
) => {
const input = startEvent.data;
if (Math.random() > 0.5) {
return new AEvent(`Hello, ${input}!`);
} else {
return new BEvent(42);
}
});
```
This step will return either an `AEvent` or a `BEvent` based on a random number.
@@ -1,196 +0,0 @@
---
title: Basic Usage
description: Learn how to use the LlamaIndex workflow.
---
A `Workflow` in LlamaIndex.TS is an event-driven abstraction used to chain together several events.
Workflows are made up of steps, with each step responsible for handling certain event types and emitting new events.
Workflows are designed for any cases that benefit from event-driven programming, not only for LLM and AI tasks.
```package-install
npm i @llamaindex/workflow
```
## Start from scratch
Let's start from a Hello World workflow.
```ts twoslash
import { Workflow } from '@llamaindex/workflow';
type ContextData = {
counter: number;
}
// ---cut---
const contextData: ContextData = { counter: 0 };
const workflow = new Workflow<ContextData, string, string>();
// ^?
```
First, we define a workflow with 3 generic types: `ContextData`, `Input`, and `Output`.
In general, `ContextData` is used to store the shared data between steps, `Input` is the type of the input event, and `Output` is the type of the output event.
In you code logic, you should **share state between steps via `ContextData`**.
```ts twoslash
import { Workflow, StartEvent, StopEvent } from '@llamaindex/workflow';
type ContextData = {
counter: number;
}
const contextData: ContextData = { counter: 0 };
const workflow = new Workflow<ContextData, string, string>();
// ---cut---
workflow.addStep({
inputs: [StartEvent<string>],
outputs: [StopEvent<string>]
}, async (context, startEvent) => {
const input = startEvent.data;
context.data.counter++;
return new StopEvent(`Hello, ${input}!`);
});
```
In the workflow, we add a step that listens to `StartEvent<string>` and emits `StopEvent<string>`.
The step is an async function that takes two arguments: `context` and `event`.
### `context` type
<AutoTypeTable path="./src/deps/type.ts" name="HandlerContext" />
There are two more properties in `HandlerContext`:
- `sendEvent`: invoke another event in the workflow, other than `StartEvent`, `StopEvent`, or the current event. (Or there will have circular reference)
- `requireEvent`: wait for a specific event to be emitted.
You can use `sendEvent` and `requireEvent` to build complex workflows.
```ts twoslash
import { Workflow, StartEvent, StopEvent, WorkflowEvent } from '@llamaindex/workflow';
type ContextData = {
counter: number;
}
const contextData: ContextData = { counter: 0 };
const workflow = new Workflow<ContextData, string, string>();
// ---cut---
class AnalysisStartEvent extends WorkflowEvent<string> {}
class AnalysisStopEvent extends WorkflowEvent<boolean> {}
workflow.addStep({
inputs: [AnalysisStartEvent],
outputs: [AnalysisStopEvent]
}, async (...args) => {
// do some analysis
return new AnalysisStopEvent(true);
})
workflow.addStep({
inputs: [StartEvent<string>],
outputs: [StopEvent<string>]
}, async (context, startEvent) => {
const input = startEvent.data;
context.sendEvent(new AnalysisStartEvent('start'));
context.data.counter++;
const { data } = await context.requireEvent(AnalysisStopEvent);
return new StopEvent(`Hello, ${input}! Analysis result: ${data ? 'success' : 'fail'}`);
});
```
For example, you can compile `requireEvent` with `waitUntil` in [Vercel Functions](https://vercel.com/docs/functions/functions-api-reference#waituntil) or [Cloudflare Worker](https://developers.cloudflare.com/workers/runtime-apis/context/#waituntil)
```ts twoslash
import { waitUntil } from '@vercel/functions';
import { Workflow, StartEvent, StopEvent, WorkflowEvent } from '@llamaindex/workflow';
type ContextData = {
counter: number;
}
const contextData: ContextData = { counter: 0 };
const workflow = new Workflow<ContextData, string, string>();
class AnalysisStartEvent extends WorkflowEvent<string> {}
class AnalysisStopEvent extends WorkflowEvent<boolean> {}
// ---cut---
workflow.addStep({
inputs: [StartEvent<string>],
outputs: [StopEvent<string>]
}, async (context, startEvent) => {
const input = startEvent.data;
context.sendEvent(new AnalysisStartEvent('start'));
context.data.counter++;
waitUntil(context.requireEvent(AnalysisStopEvent));
// note that `waitUntil` is not a promise, it will extend the lifetime of the workflow
// you can wait for some background tasks to finish
return new StopEvent(`Hello, ${input}!`);
});
```
## Multiple runs
You can run the same workflow multiple times with different inputs.
```ts twoslash
import { Workflow, StartEvent, StopEvent } from '@llamaindex/workflow';
type ContextData = {
counter: number;
}
const contextData: ContextData = { counter: 0 };
const workflow = new Workflow<ContextData, string, string>();
workflow.addStep({
inputs: [StartEvent<string>],
outputs: [StopEvent<string>]
}, async (context, startEvent) => {
const input = startEvent.data;
context.data.counter++;
return new StopEvent(`Hello, ${input}!`);
});
// ---cut---
{
const ret = await workflow.run('Alex', contextData);
console.log(ret.data); // Hello, Alex!
}
{
const ret = await workflow.run('World', contextData);
console.log(ret.data); // Hello, World!
}
```
Context is shared between runs, so the counter will be increased.
Ideally, it should be serializable to make sure it can be recovered from HTTP requests or other storage.
### Full example
<iframe
className="w-full h-[440px]"
aria-label="Workflow example"
src="https://stackblitz.com/github/run-llama/LlamaIndexTS/tree/main/examples?file=node/workflow/basic.ts"
/>
## `Workflow` type
<AutoTypeTable path="./src/deps/type.ts" name="Workflow" />
## `WorkflowContext` type
<AutoTypeTable path="./src/deps/type.ts" name="WorkflowContext" />
@@ -1,6 +0,0 @@
{
"title": "Workflow",
"description": "See how to use @llamaindex/workflow",
"defaultOpen": false,
"pages": ["index", "different-inputs-outputs", "streaming"]
}
@@ -1,199 +0,0 @@
---
title: Streaming
description: Learn how to use the LlamaIndex workflow with streaming.
---
import { WorkflowStreamingDemo } from '../../../../../components/demo/workflow-streaming-ui';
`Workflow` API by default is designed for streaming data. In this guide, we will show you how to use the `Workflow` API with streaming data.
Each `workflow.run` call returns `WorkflowContext`, which implements `AsyncIterable` interface. You can use it to stream data.
```ts twoslash
import { Workflow, WorkflowEvent, StartEvent, StopEvent } from '@llamaindex/workflow';
class ComputeEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
class ComputeResultEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
type ContextData = {
sum: number;
}
const workflow = new Workflow<ContextData, number, number>();
workflow.addStep({
inputs: [StartEvent<number>],
outputs: [StopEvent<number>]
}, async (context, startEvent) => {
const total = startEvent.data;
for (let i = 0; i < total; i++) {
context.sendEvent(new ComputeEvent(i));
}
const computeResults = await Promise.all(Array.from({ length: total }).map(() => context.requireEvent(ComputeResultEvent)));
// Workflow API allows you to start events in parallel and wait for all of them to finish
context.data.sum = computeResults.reduce((acc, curr) => acc + curr.data, 0);
return new StopEvent(context.data.sum);
});
```
We define a parallel computation workflow that computes the sum of numbers from 0 to `total`.
The workflow sends `ComputeEvent` events for each number and waits for `ComputeResultEvent` events. After receiving all `ComputeResultEvent` events, the workflow returns the sum as a `StopEvent`.
What if we want cutoff if the sum exceeds a certain value?
## Streaming
```ts twoslash
import { Workflow, WorkflowEvent, StartEvent, StopEvent } from '@llamaindex/workflow';
import { StopCircle } from 'lucide-react';
class ComputeEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
class ComputeResultEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
type ContextData = {
sum: number;
}
const workflow = new Workflow<ContextData, number, number>();
// ---cut---
const context = workflow.run(1000, {
sum: 0
});
for await (const event of context) {
if (event instanceof ComputeEvent) {
if (context.data.sum > 100) {
throw new Error('Sum exceeds 100');
}
}
if (event instanceof StopEvent) {
console.log('result', event.data);
}
}
```
You can define more custom logic using `AsyncIterable` interface.
For example. I just want to stop the workflow if I get a `ComputeResultEvent`
```ts twoslash
import { Workflow, WorkflowEvent, StartEvent, StopEvent } from '@llamaindex/workflow';
import { StopCircle } from 'lucide-react';
class ComputeEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
class ComputeResultEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
type ContextData = {
sum: number;
}
const workflow = new Workflow<ContextData, number, number>();
// ---cut---
async function compute() {
const context = workflow.run(1000, {
sum: 0
});
for await (const event of context) {
if (event instanceof ComputeResultEvent) {
return event.data;
}
}
throw new Error('UNREACHABLE');
}
const result = await compute();
```
### Streaming with UI
You can use the `Workflow` API with UI libraries like React.
```tsx twoslash
// @filename: utils.ts
export async function runWithoutBlocking(fn: () => Promise<void>) {
fn();
}
// @filename: action.ts
// ---cut---
'use server';
// "use server" is required to enable server side feature in React
import { createStreamableUI } from 'ai/rsc';
import { runWithoutBlocking } from './utils';
// ---cut-start---
import { Workflow, WorkflowEvent, StartEvent, StopEvent } from '@llamaindex/workflow';
class ComputeEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
class ComputeResultEvent extends WorkflowEvent<number> {
constructor(data: number) {
super(data);
}
}
type ContextData = {
sum: number;
}
const workflow = new Workflow<ContextData, number, number>();
const min = 100;
const max = 1000;
workflow.addStep(
{
inputs: [ComputeEvent],
outputs: [ComputeResultEvent]
},
async (context, event) => {
await new Promise((resolve) =>
setTimeout(resolve, Math.floor(Math.random() * (max - min + 1) + min))
);
return new ComputeResultEvent(event.data);
}
);
// ---cut-end---
export async function compute() {
'use server';
const ui = createStreamableUI();
const context = workflow.run(100, {
sum: 0
});
runWithoutBlocking(async () => {
for await (const event of context) {
if (event instanceof ComputeResultEvent) {
// Update UI
} else if (event instanceof StopEvent) {
// Update UI
}
// ...
}
});
return ui.value;
}
```
<WorkflowStreamingDemo />
+1 -1
View File
@@ -1,3 +1,3 @@
{
"pages": ["llamaindex", "llamaflow", "cloud", "api"]
"pages": ["llamaindex", "api"]
}
+9 -2
View File
@@ -3,12 +3,19 @@
"extends": ["//"],
"tasks": {
"build": {
"inputs": [
"node_modules/@llama-flow/docs/**",
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.mdx",
"src/**/*.md"
],
"outputs": [
".next",
".source",
"next-env.d.ts",
"src/content/docs/cloud/api/**",
"src/content/docs/api/**"
"src/content/docs/api/**",
"tsconfig.json"
],
"env": [
"LLAMA_CLOUD_API_KEY",
+2 -4
View File
@@ -2,12 +2,10 @@
"plugin": ["typedoc-plugin-markdown", "typedoc-plugin-merge-modules"],
"entryPoints": [
"../../packages/{,**/}index.ts",
"../../packages/readers/src/*.ts",
"../../packages/cloud/src/{reader,utils}.ts"
"../../packages/readers/src/*.ts"
],
"exclude": [
"../../packages/autotool/**/src/index.ts",
"../../packages/cloud/src/client/index.ts",
"**/node_modules/**",
"**/dist/**",
"**/test/**",
@@ -22,7 +20,7 @@
"categoryOrder": ["Classes", "Enums", "Functions", "Interfaces", "Types"],
"sort": ["source-order"],
"entryFileName": "index.md",
"fileExtension": ".mdx",
"fileExtension": ".md",
"hidePageTitle": true,
"hidePageHeader": true,
"hideGroupHeadings": true,
@@ -1,5 +1,17 @@
# @llamaindex/cloudflare-worker-agent-test
## 0.0.156
### Patch Changes
- llamaindex@0.10.2
## 0.0.155
### Patch Changes
- llamaindex@0.10.1
## 0.0.154
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/cloudflare-worker-agent-test",
"version": "0.0.154",
"version": "0.0.156",
"type": "module",
"private": true,
"scripts": {
+12
View File
@@ -1,5 +1,17 @@
# @llamaindex/next-agent-test
## 0.1.156
### Patch Changes
- llamaindex@0.10.2
## 0.1.155
### Patch Changes
- llamaindex@0.10.1
## 0.1.154
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-agent-test",
"version": "0.1.154",
"version": "0.1.156",
"private": true,
"scripts": {
"dev": "next dev",
@@ -1,5 +1,17 @@
# test-edge-runtime
## 0.1.155
### Patch Changes
- llamaindex@0.10.2
## 0.1.154
### Patch Changes
- llamaindex@0.10.1
## 0.1.153
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/nextjs-edge-runtime-test",
"version": "0.1.153",
"version": "0.1.155",
"private": true,
"scripts": {
"dev": "next dev",
@@ -1,5 +1,26 @@
# @llamaindex/next-node-runtime
## 0.1.23
### Patch Changes
- Updated dependencies [1e59695]
- @llamaindex/readers@3.1.0
## 0.1.22
### Patch Changes
- llamaindex@0.10.2
- @llamaindex/huggingface@0.1.6
## 0.1.21
### Patch Changes
- llamaindex@0.10.1
- @llamaindex/huggingface@0.1.5
## 0.1.20
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-node-runtime-test",
"version": "0.1.20",
"version": "0.1.23",
"private": true,
"scripts": {
"dev": "next dev",
@@ -1,5 +1,17 @@
# vite-import-llamaindex
## 0.0.22
### Patch Changes
- llamaindex@0.10.2
## 0.0.21
### Patch Changes
- llamaindex@0.10.1
## 0.0.20
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "vite-import-llamaindex",
"private": true,
"version": "0.0.20",
"version": "0.0.22",
"type": "module",
"scripts": {
"build": "vite build",
@@ -1,5 +1,17 @@
# @llamaindex/waku-query-engine-test
## 0.0.156
### Patch Changes
- llamaindex@0.10.2
## 0.0.155
### Patch Changes
- llamaindex@0.10.1
## 0.0.154
### Patch Changes
+5 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/waku-query-engine-test",
"version": "0.0.154",
"version": "0.0.156",
"type": "module",
"private": true,
"scripts": {
@@ -14,13 +14,14 @@
"react": "19.0.0",
"react-dom": "19.0.0",
"react-server-dom-webpack": "19.0.0",
"waku": "0.21.20"
"waku": "0.22.2"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.1.4",
"@types/react": "19.0.10",
"@types/react-dom": "19.0.4",
"autoprefixer": "^10.4.20",
"tailwindcss": "^4.0.9",
"rollup": "4.38.0",
"tailwindcss": "^4.1.4",
"typescript": "5.7.3"
}
}
+10 -19
View File
@@ -21,19 +21,21 @@ test.beforeEach(() => {
callback.mock.resetCalls();
});
await test("clip embedding", async (t) => {
await test.skip("clip embedding", async (t) => {
const major = parseInt(process.versions.node.split(".")[0] ?? "0", 10);
if (major < 20) {
t.skip("Skip CLIP tests on Node.js < 20");
return;
}
const imageUrl = new URL(
"../../fixtures/img/llamaindex-white.png",
import.meta.url,
);
await t.test("should trigger load transformer event", async () => {
const nodes = [
new ImageNode({
image: new URL(
"../../fixtures/img/llamaindex-white.png",
import.meta.url,
),
image: imageUrl,
}),
];
assert.equal(callback.mock.callCount(), 0);
@@ -46,21 +48,14 @@ await test("clip embedding", async (t) => {
await t.test("init & get image embedding", async () => {
const clipEmbedding = new ClipEmbedding();
const imgUrl = new URL(
"../../fixtures/img/llamaindex-white.png",
import.meta.url,
);
const vec = await clipEmbedding.getImageEmbedding(imgUrl);
const vec = await clipEmbedding.getImageEmbedding(imageUrl);
assert.ok(vec);
});
await t.test("load image document", async () => {
const nodes = [
new ImageNode({
image: new URL(
"../../fixtures/img/llamaindex-white.png",
import.meta.url,
),
image: imageUrl,
}),
];
const clipEmbedding = new ClipEmbedding();
@@ -80,12 +75,8 @@ await test("clip embedding", async (t) => {
}),
);
const clipEmbedding = new ClipEmbedding();
const imgUrl = new URL(
"../../fixtures/img/llamaindex-white.png",
import.meta.url,
);
assert.equal(getter.mock.callCount(), 0);
const vec = await clipEmbedding.getImageEmbedding(imgUrl);
const vec = await clipEmbedding.getImageEmbedding(imageUrl);
assert.ok(vec);
assert.ok(getter.mock.callCount() > 0);
});
+1 -1
View File
@@ -10,7 +10,7 @@
},
"devDependencies": {
"@faker-js/faker": "^9.2.0",
"@huggingface/transformers": "^3.0.2",
"@huggingface/transformers": "^3.5.0",
"@llamaindex/anthropic": "workspace:*",
"@llamaindex/clip": "workspace:*",
"@llamaindex/core": "workspace:*",
+55
View File
@@ -1,5 +1,60 @@
# examples
## 0.3.10
### Patch Changes
- Updated dependencies [1e59695]
- Updated dependencies [1e59695]
- Updated dependencies [1e59695]
- Updated dependencies [1e59695]
- Updated dependencies [1e59695]
- Updated dependencies [1e59695]
- @llamaindex/assemblyai@0.1.1
- @llamaindex/mongodb@0.0.17
- @llamaindex/azure@0.1.12
- @llamaindex/readers@3.1.0
- @llamaindex/notion@0.1.1
- @llamaindex/discord@0.1.1
## 0.3.9
### Patch Changes
- Updated dependencies [96dac4d]
- Updated dependencies [e5c3f95]
- @llamaindex/google@0.2.4
- @llamaindex/openai@0.3.4
- llamaindex@0.10.2
- @llamaindex/clip@0.0.52
- @llamaindex/deepinfra@0.0.52
- @llamaindex/deepseek@0.0.12
- @llamaindex/fireworks@0.0.12
- @llamaindex/groq@0.0.67
- @llamaindex/huggingface@0.1.6
- @llamaindex/jinaai@0.0.12
- @llamaindex/perplexity@0.0.9
- @llamaindex/together@0.0.12
- @llamaindex/vllm@0.0.38
## 0.3.8
### Patch Changes
- Updated dependencies [96dd798]
- @llamaindex/openai@0.3.3
- llamaindex@0.10.1
- @llamaindex/clip@0.0.51
- @llamaindex/deepinfra@0.0.51
- @llamaindex/deepseek@0.0.11
- @llamaindex/fireworks@0.0.11
- @llamaindex/groq@0.0.66
- @llamaindex/huggingface@0.1.5
- @llamaindex/jinaai@0.0.11
- @llamaindex/perplexity@0.0.8
- @llamaindex/together@0.0.11
- @llamaindex/vllm@0.0.37
## 0.3.7
### Patch Changes
@@ -1,7 +1,7 @@
import {
AudioTranscriptReader,
TranscribeParams,
} from "@llamaindex/readers/assembly-ai";
} from "@llamaindex/assemblyai";
import { program } from "commander";
import { VectorStoreIndex } from "llamaindex";
import { stdin as input, stdout as output } from "node:process";
+3 -3
View File
@@ -1,11 +1,11 @@
import { CosmosClient } from "@azure/cosmos";
import { DefaultAzureCredential } from "@azure/identity";
import { AzureCosmosDBNoSQLConfig } from "@llamaindex/azure";
import { OpenAI, OpenAIEmbedding } from "@llamaindex/openai";
import {
AzureCosmosDBNoSQLConfig,
SimpleCosmosDBReader,
SimpleCosmosDBReaderLoaderConfig,
} from "@llamaindex/readers/cosmosdb";
} from "@llamaindex/azure";
import { OpenAI, OpenAIEmbedding } from "@llamaindex/openai";
import * as dotenv from "dotenv";
import {
Settings,
@@ -1,4 +1,4 @@
import { DiscordReader } from "@llamaindex/readers/discord";
import { DiscordReader } from "@llamaindex/discord";
async function main() {
// Create an instance of the DiscordReader. Set token here or DISCORD_TOKEN environment variable
+1 -1
View File
@@ -1,4 +1,4 @@
import { SimpleMongoReader } from "@llamaindex/readers/mongo";
import { SimpleMongoReader } from "@llamaindex/mongodb";
import { Document, VectorStoreIndex } from "llamaindex";
import { MongoClient } from "mongodb";
+4 -2
View File
@@ -1,5 +1,7 @@
import { MongoDBAtlasVectorSearch } from "@llamaindex/mongodb";
import { SimpleMongoReader } from "@llamaindex/readers/mongo";
import {
MongoDBAtlasVectorSearch,
SimpleMongoReader,
} from "@llamaindex/mongodb";
import * as dotenv from "dotenv";
import { storageContextFromDefaults, VectorStoreIndex } from "llamaindex";
import { MongoClient } from "mongodb";
@@ -1,4 +1,4 @@
import { NotionReader } from "@llamaindex/readers/notion";
import { NotionReader } from "@llamaindex/notion";
import { Client } from "@notionhq/client";
import { program } from "commander";
import { VectorStoreIndex } from "llamaindex";
@@ -8,8 +8,6 @@ import { createInterface } from "node:readline/promises";
program
.argument("[page]", "Notion page id (must be provided)")
.action(async (page, _options) => {
// Initializing a client
if (!process.env.NOTION_TOKEN) {
console.log(
"No NOTION_TOKEN found in environment variables. You will need to register an integration https://www.notion.com/my-integrations and put it in your NOTION_TOKEN environment variable.",
@@ -64,10 +62,8 @@ program
const documents = await reader.loadData(page);
console.log(documents);
// Split text and create embeddings. Store them in a VectorStoreIndex
const index = await VectorStoreIndex.fromDocuments(documents);
// Create query engine
const queryEngine = index.asQueryEngine();
const rl = createInterface({ input, output });
@@ -80,7 +76,6 @@ program
const response = await queryEngine.query({ query });
// Output response
console.log(response.toString());
}
});
+20 -17
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/examples",
"version": "0.3.7",
"version": "0.3.10",
"private": true,
"scripts": {
"lint": "eslint .",
@@ -13,54 +13,57 @@
"@azure/search-documents": "^12.1.0",
"@llamaindex/anthropic": "^0.3.3",
"@llamaindex/astra": "^0.0.16",
"@llamaindex/azure": "^0.1.11",
"@llamaindex/azure": "^0.1.12",
"@llamaindex/chroma": "^0.0.16",
"@llamaindex/clip": "^0.0.50",
"@llamaindex/clip": "^0.0.52",
"@llamaindex/cloud": "^4.0.3",
"@llamaindex/cohere": "^0.0.16",
"@llamaindex/core": "^0.6.2",
"@llamaindex/deepinfra": "^0.0.50",
"@llamaindex/deepinfra": "^0.0.52",
"@llamaindex/env": "^0.1.29",
"@llamaindex/firestore": "^1.0.9",
"@llamaindex/google": "^0.2.3",
"@llamaindex/groq": "^0.0.65",
"@llamaindex/huggingface": "^0.1.4",
"@llamaindex/google": "^0.2.4",
"@llamaindex/groq": "^0.0.67",
"@llamaindex/huggingface": "^0.1.6",
"@llamaindex/milvus": "^0.1.11",
"@llamaindex/mistral": "^0.1.2",
"@llamaindex/mixedbread": "^0.0.16",
"@llamaindex/mongodb": "^0.0.16",
"@llamaindex/mongodb": "^0.0.17",
"@llamaindex/elastic-search": "^0.1.2",
"@llamaindex/node-parser": "^2.0.2",
"@llamaindex/ollama": "^0.1.2",
"@llamaindex/openai": "^0.3.2",
"@llamaindex/openai": "^0.3.4",
"@llamaindex/pinecone": "^0.1.2",
"@llamaindex/portkey-ai": "^0.0.44",
"@llamaindex/postgres": "^0.0.45",
"@llamaindex/qdrant": "^0.1.11",
"@llamaindex/readers": "^3.0.2",
"@llamaindex/readers": "^3.1.0",
"@llamaindex/replicate": "^0.0.44",
"@llamaindex/upstash": "^0.0.16",
"@llamaindex/vercel": "^0.1.2",
"@llamaindex/vllm": "^0.0.36",
"@llamaindex/vllm": "^0.0.38",
"@llamaindex/voyage-ai": "^1.0.8",
"@llamaindex/weaviate": "^0.0.16",
"@llamaindex/workflow": "^1.0.3",
"@llamaindex/deepseek": "^0.0.10",
"@llamaindex/fireworks": "^0.0.10",
"@llamaindex/together": "^0.0.10",
"@llamaindex/jinaai": "^0.0.10",
"@llamaindex/perplexity": "^0.0.7",
"@llamaindex/deepseek": "^0.0.12",
"@llamaindex/fireworks": "^0.0.12",
"@llamaindex/together": "^0.0.12",
"@llamaindex/jinaai": "^0.0.12",
"@llamaindex/perplexity": "^0.0.9",
"@llamaindex/supabase": "^0.1.1",
"@llamaindex/tools": "^0.0.5",
"@notionhq/client": "^2.2.15",
"@pinecone-database/pinecone": "^4.0.0",
"@llamaindex/assemblyai": "^0.1.1",
"@llamaindex/discord": "^0.1.1",
"@llamaindex/notion": "^0.1.1",
"@vercel/postgres": "^0.10.0",
"ai": "^4.0.0",
"ajv": "^8.17.1",
"commander": "^12.1.0",
"dotenv": "^16.4.5",
"js-tiktoken": "^1.0.14",
"llamaindex": "^0.10.0",
"llamaindex": "^0.10.2",
"mongodb": "6.7.0",
"postgres": "^3.4.4",
"wikipedia": "^2.1.2",
-1
View File
@@ -11,7 +11,6 @@
"start:pdf": "node --import tsx ./src/pdf.ts",
"start:llamaparse": "node --import tsx ./src/llamaparse.ts",
"start:notion": "node --import tsx ./src/notion.ts",
"start:assemblyai": "node --import tsx ./src/assemblyai.ts",
"start:llamaparse-dir": "node --import tsx ./src/simple-directory-reader-with-llamaparse.ts",
"start:llamaparse-json": "node --import tsx ./src/llamaparse-json.ts",
"start:discord": "node --import tsx ./src/discord.ts",
+3 -4
View File
@@ -21,12 +21,14 @@
},
"devDependencies": {
"@changesets/cli": "^2.27.5",
"@eslint/js": "^9.25.0",
"bunchee": "6.4.0",
"eslint": "9.22.0",
"eslint-config-next": "^15.1.0",
"eslint-config-prettier": "^9.1.0",
"eslint-config-turbo": "^2.3.3",
"eslint-plugin-react": "7.37.2",
"eslint-plugin-turbo": "^2.5.0",
"globals": "^15.12.0",
"husky": "^9.1.7",
"lint-staged": "^15.2.11",
@@ -39,7 +41,7 @@
"typescript-eslint": "^8.18.0",
"vitest": "^3.1.1"
},
"packageManager": "pnpm@9.12.3",
"packageManager": "pnpm@10.8.1",
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --fix",
@@ -48,8 +50,5 @@
"*.{json,md,yml}": [
"prettier --write"
]
},
"dependencies": {
"p-retry": "^6.2.1"
}
}
+12
View File
@@ -1,5 +1,17 @@
# @llamaindex/autotool
## 7.0.2
### Patch Changes
- llamaindex@0.10.2
## 7.0.1
### Patch Changes
- llamaindex@0.10.1
## 7.0.0
### Patch Changes
@@ -1,5 +1,19 @@
# @llamaindex/autotool-01-node-example
## 0.0.103
### Patch Changes
- llamaindex@0.10.2
- @llamaindex/autotool@7.0.2
## 0.0.102
### Patch Changes
- llamaindex@0.10.1
- @llamaindex/autotool@7.0.1
## 0.0.101
### Patch Changes
@@ -13,5 +13,5 @@
"scripts": {
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
},
"version": "0.0.101"
"version": "0.0.103"
}
+1 -1
View File
@@ -6,7 +6,7 @@
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
"directory": "packages/autotool"
},
"version": "7.0.0",
"version": "7.0.2",
"description": "auto transpile your JS function to LLM Agent compatible",
"files": [
"dist",
+3
View File
@@ -63,5 +63,8 @@
"peerDependencies": {
"@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*"
},
"dependencies": {
"p-retry": "^6.2.1"
}
}
+2 -2
View File
@@ -116,7 +116,7 @@
"test": "vitest"
},
"devDependencies": {
"@huggingface/transformers": "^3.0.2",
"@huggingface/transformers": "^3.5.0",
"@types/node": "^22.9.0",
"@types/readable-stream": "^4.0.15",
"vitest": "^2.1.5"
@@ -127,7 +127,7 @@
"js-tiktoken": "^1.0.12"
},
"peerDependencies": {
"@huggingface/transformers": "^3.0.2",
"@huggingface/transformers": "^3.5.0",
"gpt-tokenizer": "^2.5.0"
},
"peerDependenciesMeta": {
+12
View File
@@ -1,5 +1,17 @@
# @llamaindex/experimental
## 0.0.172
### Patch Changes
- llamaindex@0.10.2
## 0.0.171
### Patch Changes
- llamaindex@0.10.1
## 0.0.170
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/experimental",
"description": "Experimental package for LlamaIndexTS",
"version": "0.0.170",
"version": "0.0.172",
"type": "module",
"types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js",
+14
View File
@@ -1,5 +1,19 @@
# llamaindex
## 0.10.2
### Patch Changes
- Updated dependencies [e5c3f95]
- @llamaindex/openai@0.3.4
## 0.10.1
### Patch Changes
- Updated dependencies [96dd798]
- @llamaindex/openai@0.3.3
## 0.10.0
### Minor Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "llamaindex",
"version": "0.10.0",
"version": "0.10.2",
"license": "MIT",
"type": "module",
"keywords": [
@@ -0,0 +1,7 @@
# @llamaindex/assemblyai
## 0.1.1
### Patch Changes
- 1e59695: Introduce an independent package for assemblyai
@@ -0,0 +1,32 @@
{
"name": "@llamaindex/assemblyai",
"description": "AssemblyAI Reader for LlamaIndex",
"version": "0.1.1",
"type": "module",
"types": "dist/index.d.ts",
"main": "dist/index.cjs",
"module": "dist/index.js",
"exports": {
".": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
"directory": "packages/providers/assemblyai"
},
"scripts": {
"build": "bunchee",
"dev": "bunchee --watch"
},
"dependencies": {
"assemblyai": "^4.8.0",
"@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*"
}
}
@@ -0,0 +1 @@
export * from "./reader";
@@ -0,0 +1,19 @@
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "bundler",
"outDir": "./lib",
"tsBuildInfoFile": "./lib/.tsbuildinfo"
},
"include": ["./src"],
"references": [
{
"path": "../../core/tsconfig.json"
},
{
"path": "../../env/tsconfig.json"
}
]
}
+14
View File
@@ -1,5 +1,19 @@
# @llamaindex/clip
## 0.0.52
### Patch Changes
- Updated dependencies [e5c3f95]
- @llamaindex/openai@0.3.4
## 0.0.51
### Patch Changes
- Updated dependencies [96dd798]
- @llamaindex/openai@0.3.3
## 0.0.50
### Patch Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/clip",
"description": "Clip Embedding Adapter for LlamaIndex",
"version": "0.0.50",
"version": "0.0.52",
"type": "module",
"types": "dist/index.d.ts",
"main": "dist/index.cjs",
@@ -39,7 +39,7 @@
"dev": "bunchee --watch"
},
"dependencies": {
"@huggingface/transformers": "^3.0.2",
"@huggingface/transformers": "^3.5.0",
"@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*",
"@llamaindex/openai": "workspace:*"
+14
View File
@@ -1,5 +1,19 @@
# @llamaindex/deepinfra
## 0.0.52
### Patch Changes
- Updated dependencies [e5c3f95]
- @llamaindex/openai@0.3.4
## 0.0.51
### Patch Changes
- Updated dependencies [96dd798]
- @llamaindex/openai@0.3.3
## 0.0.50
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/deepinfra",
"description": "Deepinfra Adapter for LlamaIndex",
"version": "0.0.50",
"version": "0.0.52",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
+14
View File
@@ -1,5 +1,19 @@
# @llamaindex/deepseek
## 0.0.12
### Patch Changes
- Updated dependencies [e5c3f95]
- @llamaindex/openai@0.3.4
## 0.0.11
### Patch Changes
- Updated dependencies [96dd798]
- @llamaindex/openai@0.3.3
## 0.0.10
### Patch Changes

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