Compare commits

...

22 Commits

Author SHA1 Message Date
Alex Yang c4356f22a2 fix(docs): use docs.toFumadocsSource 2025-03-09 00:11:58 -08:00
Alex Yang f24a9dfe00 fix(docs): openapi generation & twoslash fix (#1720) 2025-03-09 00:02:30 -08:00
Alex Yang e31d6ba472 fix(docs): development error 2025-03-08 21:51:43 -08:00
Alex Yang d212240d64 feat: use fumadoc 15 + tailwind 4 (#1690)
Co-authored-by: thucpn <thucsh2@gmail.com>
2025-03-07 23:30:54 -08:00
github-actions[bot] cb73f77bb8 Release 0.9.9 (#1713)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: marcusschiesser <17126+marcusschiesser@users.noreply.github.com>
2025-03-07 16:28:36 +07:00
Huu Le 8bf1ca1701 Support chat stream with tools for Anthropic LLM (#1710)
Co-authored-by: thucpn <thucsh2@gmail.com>
Co-authored-by: Thuc Pham <51660321+thucpn@users.noreply.github.com>
2025-03-07 15:41:15 +07:00
Alexander Tigselema 58b3ee52e0 Add Gemini 2.0 Flas Lite, Fix tools error with LLM Agent (#1712) 2025-03-07 11:15:51 +07:00
Thomas Vanier 4bac71d6a2 feat: additional tool argument (#1693) 2025-03-07 11:15:10 +07:00
github-actions[bot] a3cbcb31a2 Release 0.9.8 (#1711)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: marcusschiesser <17126+marcusschiesser@users.noreply.github.com>
2025-03-06 16:33:19 +07:00
Thuc Pham bbc8c8787d fix: prefer using embedding model from vector store (#1708) 2025-03-06 16:24:05 +07:00
Huu Le 4b49428f57 fix agent workflow tool call for Ollama (#1706)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2025-03-06 11:13:42 +07:00
Peter Goldstein 7ee4968b06 Add Gemini 2.0 Pro Experimental (#1707) 2025-03-06 11:04:56 +07:00
github-actions[bot] 0111f5c8b0 Release 0.9.7 (#1703)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: marcusschiesser <17126+marcusschiesser@users.noreply.github.com>
2025-03-05 16:59:05 +07:00
Thuc Pham beb922b743 fix: build fail in edge runtime (#1705)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2025-03-05 16:35:00 +07:00
patryktop e28c29d1f5 feat: add Llama 3.3 70B Instruct to community package (#1702) 2025-03-04 17:27:35 -08:00
github-actions[bot] 008cccd9f1 Release 0.9.6 (#1698) 2025-03-04 17:33:18 +07:00
Huu Le 081698d68c chore: simplify imports of agent workflow (#1700) 2025-03-04 17:01:29 +07:00
Huu Le ab5fe5d7a0 chore: remove core import in document (#1699) 2025-03-04 16:14:31 +07:00
Huu Le 56689707d3 feat: Support AgentWorkflow (#1685)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2025-03-04 16:05:25 +07:00
Brian Lange fd74ba4bf1 fix: Voyage typescript configs + docs (#1696) 2025-03-04 11:00:05 +07:00
github-actions[bot] b2634e47ca Release 0.9.5 (#1694)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: marcusschiesser <17126+marcusschiesser@users.noreply.github.com>
2025-02-28 18:18:14 +07:00
Thuc Pham ad3c7f1ec1 fix: streaming issues with LLMAgent (#1692) 2025-02-28 18:13:36 +07:00
240 changed files with 6486 additions and 4496 deletions
+61
View File
@@ -1,5 +1,66 @@
# @llamaindex/doc
## 0.1.9
### Patch Changes
- 4bac71d: Support binding additional argument to function tool
- Updated dependencies [4bac71d]
- @llamaindex/core@0.5.7
- @llamaindex/cloud@3.0.8
- llamaindex@0.9.9
- @llamaindex/node-parser@1.0.7
- @llamaindex/openai@0.1.59
- @llamaindex/readers@2.0.7
- @llamaindex/workflow@0.0.15
## 0.1.8
### Patch Changes
- Updated dependencies [4b49428]
- Updated dependencies [bbc8c87]
- @llamaindex/workflow@0.0.14
- llamaindex@0.9.8
## 0.1.7
### Patch Changes
- Updated dependencies [beb922b]
- @llamaindex/core@0.5.6
- llamaindex@0.9.7
- @llamaindex/cloud@3.0.7
- @llamaindex/node-parser@1.0.6
- @llamaindex/openai@0.1.58
- @llamaindex/readers@2.0.6
- @llamaindex/workflow@0.0.13
## 0.1.6
### Patch Changes
- Updated dependencies [5668970]
- @llamaindex/core@0.5.5
- @llamaindex/workflow@0.0.12
- @llamaindex/cloud@3.0.6
- llamaindex@0.9.6
- @llamaindex/node-parser@1.0.5
- @llamaindex/openai@0.1.57
- @llamaindex/readers@2.0.5
## 0.1.5
### Patch Changes
- Updated dependencies [ad3c7f1]
- @llamaindex/core@0.5.4
- @llamaindex/cloud@3.0.5
- llamaindex@0.9.5
- @llamaindex/node-parser@1.0.4
- @llamaindex/openai@0.1.56
- @llamaindex/readers@2.0.4
## 0.1.4
### Patch Changes
+8 -1
View File
@@ -5,8 +5,15 @@ const withMDX = createMDX();
/** @type {import('next').NextConfig} */
const config = {
reactStrictMode: true,
eslint: {
ignoreDuringBuilds: true,
},
transpilePackages: ["monaco-editor"],
serverExternalPackages: ["@huggingface/transformers"],
serverExternalPackages: [
"@huggingface/transformers",
"twoslash",
"typescript",
],
webpack: (config, { isServer }) => {
if (Array.isArray(config.target) && config.target.includes("web")) {
config.target = ["web", "es2020"];
+26 -24
View File
@@ -1,18 +1,19 @@
{
"name": "@llamaindex/doc",
"version": "0.1.4",
"version": "0.1.9",
"private": true,
"scripts": {
"build": "pnpm run build:docs && next build",
"postinstall": "fumadocs-mdx",
"prebuild": "pnpm run build:docs",
"build": "next build",
"dev": "next dev",
"start": "next start",
"postdev": "fumadocs-mdx",
"postbuild": "fumadocs-mdx && tsx scripts/post-build.mts",
"build:docs": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" typedoc && node ./scripts/generate-docs.mjs"
"postbuild": "tsx scripts/post-build.mts",
"build:docs": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" typedoc && tsx scripts/generate-docs.mts"
},
"dependencies": {
"@icons-pack/react-simple-icons": "^10.1.0",
"@llamaindex/chat-ui": "0.0.9",
"@llamaindex/chat-ui": "0.2.0",
"@llamaindex/cloud": "workspace:*",
"@llamaindex/core": "workspace:*",
"@llamaindex/node-parser": "workspace:*",
@@ -27,24 +28,24 @@
"@radix-ui/react-slider": "^1.2.1",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.4",
"@vercel/functions": "^1.5.0",
"@scalar/api-client-react": "^1.1.25",
"@vercel/functions": "^1.5.0",
"ai": "^3.4.33",
"class-variance-authority": "^0.7.0",
"clsx": "2.1.1",
"foxact": "^0.2.41",
"framer-motion": "^11.11.17",
"fumadocs-core": "^14.7.7",
"fumadocs-docgen": "^1.3.7",
"fumadocs-mdx": "^11.5.3",
"fumadocs-openapi": "^5.12.0",
"fumadocs-twoslash": "^2.0.3",
"fumadocs-typescript": "^3.0.3",
"fumadocs-ui": "^14.7.7",
"fumadocs-core": "^15.0.15",
"fumadocs-docgen": "^2.0.0",
"fumadocs-mdx": "^11.5.6",
"fumadocs-openapi": "^6.3.0",
"fumadocs-twoslash": "^3.1.0",
"fumadocs-typescript": "^3.1.0",
"fumadocs-ui": "^15.0.15",
"hast-util-to-jsx-runtime": "^2.3.2",
"llamaindex": "workspace:*",
"lucide-react": "^0.460.0",
"next": "15.1.7",
"next": "^15.2.1",
"next-themes": "^0.4.3",
"react": "^19.0.0",
"react-dom": "^19.0.0",
@@ -55,8 +56,8 @@
"rehype-katex": "^7.0.1",
"remark-math": "^6.0.0",
"rimraf": "^6.0.1",
"shiki": "^2.3.2",
"shiki-magic-move": "^1.0.0",
"shiki": "^3.1.0",
"shiki-magic-move": "^1.0.1",
"swr": "^2.2.5",
"tailwind-merge": "^2.5.2",
"tailwindcss-animate": "^1.0.7",
@@ -67,27 +68,28 @@
"zod": "^3.23.8"
},
"devDependencies": {
"@next/env": "^15.0.3",
"@next/env": "^15.2.1",
"@tailwindcss/postcss": "^4.0.9",
"@types/mdx": "^2.0.13",
"@types/node": "22.9.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"autoprefixer": "^10.4.20",
"cross-env": "^7.0.3",
"fast-glob": "^3.3.2",
"gray-matter": "^4.0.3",
"monaco-editor-webpack-plugin": "^7.1.0",
"postcss": "^8.4.49",
"postcss": "^8.5.3",
"raw-loader": "^4.0.2",
"remark": "^15.0.1",
"remark-gfm": "^4.0.0",
"remark-mdx": "^3.1.0",
"remark-stringify": "^11.0.0",
"tailwindcss": "^3.4.15",
"tsx": "^4.19.2",
"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",
"typescript": "^5.7.2"
"typescript": "^5.7.3"
}
}
-6
View File
@@ -1,6 +0,0 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
+5
View File
@@ -0,0 +1,5 @@
export default {
plugins: {
"@tailwindcss/postcss": {},
},
};
@@ -1,8 +1,7 @@
import * as OpenAPI from "fumadocs-openapi";
import { generateFiles } from "fumadocs-typescript";
import { generateFiles as openapiGenerateFiles } from "fumadocs-openapi";
import { generateFiles as typescriptGenerateFiles } from "fumadocs-typescript";
import fs from "node:fs";
import * as path from "node:path";
import { fileURLToPath } from "node:url";
import { rimrafSync } from "rimraf";
const out = "./src/content/docs/cloud/api";
@@ -15,28 +14,23 @@ rimrafSync(out, {
},
});
void OpenAPI.generateFiles({
input: [
fileURLToPath(
new URL("../../../packages/cloud/openapi.json", import.meta.url),
),
],
output: out,
void openapiGenerateFiles({
input: ["../../packages/cloud/openapi.json"],
output: "./src/content/docs/cloud/api",
groupBy: "tag",
});
void generateFiles({
void typescriptGenerateFiles({
input: ["./src/content/docs/api/**/*.mdx"],
output: (file) => path.resolve(path.dirname(file), path.basename(file)),
transformOutput,
});
function transformOutput(filePath, content) {
function transformOutput(filePath: string, content: string) {
const fileName = path.basename(filePath);
let title = fileName.split(".")[0];
let pageContent = content;
if (title === "index") title = "LlamaIndex API Reference";
return `---\ntitle: ${title}\n---\n\n${transformAbsoluteUrl(pageContent, filePath)}`;
return `---\ntitle: ${title}\n---\n\n${transformAbsoluteUrl(content, filePath)}`;
}
/**
@@ -46,20 +40,17 @@ function transformOutput(filePath, content) {
* [text](BaseVectorStore.mdx#constructors) -> [text](/docs/api/classes/BaseVectorStore#constructors)
* [text](TaskStep.mdx) -> [text](/docs/api/type-aliases/TaskStep)
*/
function transformAbsoluteUrl(content, filePath) {
function transformAbsoluteUrl(content: string, filePath: string) {
const group = path.dirname(filePath).split(path.sep).pop();
return content.replace(
/\]\(([^)]+)\.mdx([^)]*)\)/g,
(match, slug, anchor) => {
const slugParts = slug.split("/");
const fileName = slugParts[slugParts.length - 1];
const fileGroup = slugParts[slugParts.length - 2] ?? group;
const result = ["/docs/api", fileGroup, fileName, anchor]
.filter(Boolean)
.join("/");
return `](${result})`;
},
);
return content.replace(/\]\(([^)]+)\.mdx([^)]*)\)/g, (_, slug, anchor) => {
const slugParts = slug.split("/");
const fileName = slugParts[slugParts.length - 1];
const fileGroup = slugParts[slugParts.length - 2] ?? group;
const result = ["/docs/api", fileGroup, fileName, anchor]
.filter(Boolean)
.join("/");
return `](${result})`;
});
}
// append meta.json for API page
+4 -7
View File
@@ -1,11 +1,7 @@
import { upsertBatchPipelineDocumentsApiV1PipelinesPipelineIdDocumentsPut } from "@llamaindex/cloud/api";
import fg from "fast-glob";
import {
fileGenerator,
remarkDocGen,
remarkInstall,
typescriptGenerator,
} from "fumadocs-docgen";
import { fileGenerator, remarkDocGen, remarkInstall } from "fumadocs-docgen";
import { remarkAutoTypeTable } from "fumadocs-typescript";
import matter from "gray-matter";
import * as fs from "node:fs/promises";
import path, { relative } from "node:path";
@@ -21,7 +17,8 @@ async function processContent(content: string): Promise<string> {
const file = await remark()
.use(remarkMdx)
.use(remarkGfm)
.use(remarkDocGen, { generators: [typescriptGenerator(), fileGenerator()] })
.use(remarkAutoTypeTable)
.use(remarkDocGen, { generators: [fileGenerator()] })
.use(remarkInstall, { persist: { id: "package-manager" } })
.use(remarkStringify)
.process(content);
+1 -1
View File
@@ -5,7 +5,7 @@ import { transformerTwoslash } from "fumadocs-twoslash";
import rehypeKatex from "rehype-katex";
import remarkMath from "remark-math";
export const { docs, meta } = defineDocs({
export const docs = defineDocs({
dir: "./src/content/docs",
});
-11
View File
@@ -1,11 +0,0 @@
import { LEGACY_DOCUMENT_URL } from "@/lib/const";
import { redirect } from "next/navigation";
export default async function Page(props: {
params: Promise<{
any: string[];
}>;
}) {
const path = await props.params.then(({ any }) => any.join("/"));
return redirect(new URL(path, LEGACY_DOCUMENT_URL).toString());
}
+1 -1
View File
@@ -29,7 +29,6 @@ export default async function Page(props: {
editOnGithub={{
owner: "run-llama",
repo: "LlamaIndexTS",
sha: "main",
path: `apps/next/src/content/docs/${page.file.path}`,
}}
>
@@ -64,6 +63,7 @@ export async function generateMetadata(props: {
return createMetadata(
metadataImage.withImage(page.slugs, {
metadataBase: new URL("https://ts.llamaindex.ai"),
title: page.data.title,
description: page.data.description,
openGraph: {
+11 -40
View File
@@ -1,6 +1,13 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@import "tailwindcss";
@import "fumadocs-ui/css/neutral.css";
@import "fumadocs-ui/css/preset.css";
@import "../../node_modules/fumadocs-twoslash/dist/twoslash.css";
@plugin "tailwindcss-animate";
@source '../../node_modules/fumadocs-ui/dist/**/*.js';
@source "../../node_modules/fumadocs-openapi/dist/**/*.js",
@source '../../node_modules/@llamaindex/chat-ui/dist/**/*.js';
@config "../../tailwind.config.mjs";
@layer base {
:root {
--page-max-width: 1840px;
@@ -46,6 +53,7 @@
--chart-5: 27 87% 67%;
--radius: 0.5rem;
}
.dark {
--color-neutral-000: #0e0c15;
--color-neutral-100: #252134;
@@ -87,40 +95,3 @@
--chart-5: 340 75% 55%;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
}
/*
* Override default styles for Markdown
*/
.prose
:where(blockquote):not(
:where([class~="not-prose"], [class~="not-prose"] *)
) {
font-style: normal !important;
}
.prose
:where(blockquote p:first-of-type):not(
:where([class~="not-prose"], [class~="not-prose"] *)
):before {
content: none !important;
}
.prose
:where(blockquote p:first-of-type):not(
:where([class~="not-prose"], [class~="not-prose"] *)
):after {
content: none !important;
}
.prose
:where(code):not(:where([class~="not-prose"], [class~="not-prose"] *)) {
@apply text-blue-600 !important;
}
}
+5 -34
View File
@@ -1,50 +1,21 @@
import { highlight } from "fumadocs-core/highlight";
import * as Base from "fumadocs-ui/components/codeblock";
import { toJsxRuntime, type Jsx } from "hast-util-to-jsx-runtime";
import { Fragment } from "react";
import { jsx, jsxs } from "react/jsx-runtime";
import { codeToHast } from "shiki";
import type { BundledLanguage } from "shiki";
export interface CodeBlockProps {
code: string;
wrapper?: Base.CodeBlockProps;
lang: "bash" | "ts" | "tsx";
lang: BundledLanguage;
}
export async function CodeBlock({
code,
lang,
wrapper,
}: CodeBlockProps): Promise<React.ReactElement> {
const hast = await codeToHast(code, {
export async function CodeBlock({ code, lang, wrapper }: CodeBlockProps) {
const rendered = await highlight(code, {
lang,
defaultColor: false,
themes: {
light: "github-light",
dark: "vesper",
},
transformers: [
{
name: "rehype-code:pre-process",
line(node) {
if (node.children.length === 0) {
// Keep the empty lines when using grid layout
node.children.push({
type: "text",
value: " ",
});
}
},
},
],
});
const rendered = toJsxRuntime(hast, {
jsx: jsx as Jsx,
jsxs: jsxs as Jsx,
Fragment,
development: false,
components: {
// @ts-expect-error -- JSX component
pre: Base.Pre,
},
});
@@ -1,11 +1,16 @@
"use client";
import { ChatInput, ChatMessages, ChatSection } from "@llamaindex/chat-ui";
import {
ChatHandler,
ChatInput,
ChatMessages,
ChatSection,
} from "@llamaindex/chat-ui";
import { useChat } from "ai/react";
export const ChatDemo = () => {
const handler = useChat();
return (
<ChatSection handler={handler}>
<ChatSection handler={handler as ChatHandler}>
<ChatMessages>
<ChatMessages.List className="h-auto max-h-[400px]" />
<ChatMessages.Actions />
@@ -1,23 +1,25 @@
"use client";
import {
ChatHandler,
ChatInput,
ChatMessage,
ChatMessages,
ChatSection as ChatSectionUI,
Message,
} from "@llamaindex/chat-ui";
import { useChatRSC } from "./use-chat-rsc";
export const ChatSectionRSC = () => {
const handler = useChatRSC();
return (
<ChatSectionUI handler={handler}>
<ChatSectionUI handler={handler as ChatHandler}>
<ChatMessages>
<ChatMessages.List className="h-auto max-h-[400px]">
{handler.messages.map((message, index) => (
<ChatMessage
key={index}
message={message}
message={message as Message}
isLast={index === handler.messages.length - 1}
>
<ChatMessage.Avatar />
+1 -1
View File
@@ -2,5 +2,5 @@
"title": "LlamaCloud",
"description": "The Cloud framework for LLM",
"root": true,
"pages": ["---Guide---", "index", "api"]
"pages": ["---Guide---", "index", "..."]
}
@@ -3,6 +3,8 @@ title: With Node.js/Bun/Deno
description: In this guide, you'll learn how to use LlamaIndex with Node.js, Bun, and Deno.
---
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
## 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.
@@ -22,6 +24,26 @@ node --env-file .env your-script.js
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:
<Tabs groupId="install" items={["npm", "yarn", "pnpm"]} persist>
```shell tab="npm"
npm install gpt-tokenizer
```
```shell tab="yarn"
yarn add gpt-tokenizer
```
```shell tab="pnpm"
pnpm add gpt-tokenizer
```
</Tabs>
> Note: This only works for Node.js
## TypeScript support
<Card
@@ -34,6 +34,7 @@ First we'll need to pull in our dependencies. These are:
import { FunctionTool, Settings } from "llamaindex";
import { OpenAI, OpenAIAgent } from "@llamaindex/openai";
import "dotenv/config";
import { z } from "zod";
```
### Initialize your LLM
@@ -86,20 +87,14 @@ This is the most complicated part of creating an agent. We need to define a `Fun
const tool = FunctionTool.from(sumNumbers, {
name: "sumNumbers",
description: "Use this function to sum two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "First number to sum",
},
b: {
type: "number",
description: "Second number to sum",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number({
description: "First number to sum",
}),
b: z.number({
description: "Second number to sum",
}),
}),
});
```
@@ -2,7 +2,7 @@
title: A RAG agent that does math
---
In [our third iteration of the agent](https://github.com/run-llama/ts-agents/blob/main/3_rag_and_tools/agent.ts) we've combined the two previous agents, so we've defined both `sumNumbers` and a `QueryEngineTool` and created an array of two tools:
In [our third iteration of the agent](https://github.com/run-llama/ts-agents/blob/main/3_rag_and_tools/agent.ts) we've combined the two previous agents, so we've defined both `sumNumbers` and a `QueryEngineTool` and created an array of two tools. The tools support both Zod and JSON Schema for parameter definition:
```javascript
// define the query engine as a tool
@@ -17,24 +17,42 @@ const tools = [
FunctionTool.from(sumNumbers, {
name: "sumNumbers",
description: "Use this function to sum two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "First number to sum",
},
b: {
type: "number",
description: "Second number to sum",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number({
description: "First number to sum",
}),
b: z.number({
description: "Second number to sum",
}),
}),
}),
];
```
You can also use JSON Schema to define the tool parameters as an alternative to Zod.
```javascript
FunctionTool.from(sumNumbers, {
name: "sumNumbers",
description: "Use this function to sum two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "First number to sum",
},
b: {
type: "number",
description: "Second number to sum",
},
},
required: ["a", "b"],
},
}),
```
These tool descriptions are identical to the ones we previously defined. Now let's ask it 3 questions in a row:
```javascript
@@ -3,8 +3,6 @@ title: Using API Route
description: Chat interface for your LlamaIndexTS application using API Route
---
import { ChatDemo } from '../../../../../components/demo/chat/api/demo';
import "@llamaindex/chat-ui/styles/code.css";
import "@llamaindex/chat-ui/styles/katex.css";
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.
@@ -0,0 +1,22 @@
---
title: Install @llamaindex/chat
description: Chat interface for your LlamaIndexTS application
---
## Quick Start
You can quickly add a chatbot to your project by using Shadcn CLI command:
```sh
npx shadcn@latest add https://ui.llamaindex.ai/r/chat.json
```
## Manual Installation
To install the package, run the following command in your project directory:
```sh
npm install @llamaindex/chat-ui
```
For more information, check out the [github.comrun-llama/chat-ui](https://github.com/run-llama/chat-ui)
@@ -1,6 +1,6 @@
{
"title": "Chat-UI",
"title": "Chat UI",
"description": "Use chat-ui to add a chat interface to your LlamaIndexTS application.",
"defaultOpen": false,
"pages": ["chat", "rsc"]
"pages": ["install", "chat", "rsc"]
}
@@ -3,8 +3,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';
import "@llamaindex/chat-ui/styles/code.css";
import "@llamaindex/chat-ui/styles/katex.css";
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).
@@ -0,0 +1,139 @@
---
title: Agent Workflow
---
import { DynamicCodeBlock } from 'fumadocs-ui/components/dynamic-codeblock';
import CodeSource from "!raw-loader!../../../../../../../examples/agentworkflow/blog_writer.ts";
import { Tab, Tabs } from "fumadocs-ui/components/tabs";
`AgentWorkflow` is a powerful system that enables you to create and orchestrate one or multiple agents with tools to perform specific tasks. It's built on top of the base `Workflow` system and provides a streamlined interface for agent interactions.
## Installation
You'll need to install the `@llamaindex/workflow` package:
<Tabs groupId="install" items={["npm", "yarn", "pnpm"]} persist>
```shell tab="npm"
npm install @llamaindex/workflow
```
```shell tab="yarn"
yarn add @llamaindex/workflow
```
```shell tab="pnpm"
pnpm add @llamaindex/workflow
```
</Tabs>
## Usage
### Single Agent Workflow
The simplest use case is creating a single agent with specific tools. Here's an example of creating an assistant that tells jokes:
```typescript
import { AgentWorkflow, FunctionTool } from "llamaindex";
import { OpenAI } from "@llamaindex/openai";
// Define a joke-telling tool
const jokeTool = FunctionTool.from(
() => "Baby Llama is called cria",
{
name: "joke",
description: "Use this tool to get a joke",
}
);
// Create an agent workflow with the tool
const workflow = AgentWorkflow.fromTools({
tools: [jokeTool],
llm: new OpenAI({
model: "gpt-4o-mini",
}),
});
// Run the workflow
const result = await workflow.run("Tell me something funny");
console.log(result); // Baby Llama is called cria
```
### Event Streaming
`AgentWorkflow` provides a unified interface for event streaming, making it easy to track and respond to different events during execution:
```typescript
import { AgentToolCall, AgentStream } from "llamaindex";
// Get the workflow execution context
const context = workflow.run("Tell me something funny");
// Stream and handle events
for await (const event of context) {
if (event instanceof AgentToolCall) {
console.log(`Tool being called: ${event.data.toolName}`);
}
if (event instanceof AgentStream) {
process.stdout.write(event.data.delta);
}
}
```
### Multi-Agent Workflow
`AgentWorkflow` can orchestrate multiple agents, enabling complex interactions and task handoffs. Each agent in a multi-agent workflow requires:
- `name`: Unique identifier for the agent
- `description`: Purpose description used for task routing
- `tools`: Array of tools the agent can use
- `canHandoffTo` (optional): Array of agent names or agent instances that this agent can delegate tasks to
Here's an example of a multi-agent system that combines joke-telling and weather information:
```typescript
import { AgentWorkflow, FunctionAgent, FunctionTool } from "llamaindex";
import { OpenAI } from "@llamaindex/openai";
import { z } from "zod";
// Create a weather agent
const weatherAgent = new FunctionAgent({
name: "WeatherAgent",
description: "Provides weather information for any city",
tools: [
FunctionTool.from(
({ city }: { city: string }) => `The weather in ${city} is sunny`,
{
name: "fetchWeather",
description: "Get weather information for a city",
parameters: z.object({
city: z.string(),
}),
}
),
],
llm: new OpenAI({ model: "gpt-4o-mini" }),
});
// Create a joke-telling agent
const jokeAgent = new FunctionAgent({
name: "JokeAgent",
description: "Tells jokes and funny stories",
tools: [jokeTool], // Using the joke tool defined earlier
llm: new OpenAI({ model: "gpt-4o-mini" }),
canHandoffTo: [weatherAgent], // Can hand off to the weather agent
});
// Create the multi-agent workflow
const workflow = new AgentWorkflow({
agents: [jokeAgent, weatherAgent],
rootAgent: jokeAgent, // Start with the joke agent
});
// Run the workflow
const result = await workflow.run(
"Give me a morning greeting with a joke and the weather in San Francisco"
);
```
The workflow will coordinate between agents, allowing them to handle different aspects of the request and hand off tasks when appropriate.
@@ -2,10 +2,11 @@
title: Jina AI
---
To use Jina AI embeddings, you need to import `JinaAIEmbedding` from `llamaindex`.
To use Jina AI embeddings, you need to import `JinaAIEmbedding` from `@llamaindex/jinaai`.
```ts
import { JinaAIEmbedding, Settings } from "llamaindex";
import { Settings } from "llamaindex";
import { JinaAIEmbedding } from "@llamaindex/jinaai";
Settings.embedModel = new JinaAIEmbedding();
@@ -2,10 +2,11 @@
title: Together
---
To use together embeddings, you need to import `TogetherEmbedding` from `llamaindex`.
To use together embeddings, you need to import `TogetherEmbedding` from `@llamaindex/together`.
```ts
import { TogetherEmbedding, Settings } from "llamaindex";
import { Settings } from "llamaindex";
import { TogetherEmbedding } from "@llamaindex/together";
Settings.embedModel = new TogetherEmbedding({
apiKey: "<YOUR_API_KEY>",
@@ -127,26 +127,21 @@ async function main() {
```ts
import { BEDROCK_MODELS, Bedrock } from "@llamaindex/community";
import { FunctionTool, LLMAgent } from "llamaindex";
import { z } from "zod";
const sumNumbers = FunctionTool.from(
({ a, b }: { a: number; b: number }) => `${a + b}`,
{
name: "sumNumbers",
description: "Use this function to sum two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "The first number",
},
b: {
type: "number",
description: "The second number",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number({
description: "The first number",
}),
b: z.number({
description: "The second number",
}),
}),
},
);
@@ -155,20 +150,14 @@ const divideNumbers = FunctionTool.from(
{
name: "divideNumbers",
description: "Use this function to divide two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "The dividend a to divide",
},
b: {
type: "number",
description: "The divisor b to divide by",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number({
description: "The dividend a to divide",
}),
b: z.number({
description: "The divisor b to divide by",
}),
}),
},
);
@@ -7,7 +7,8 @@ title: DeepSeek LLM
## Usage
```ts
import { DeepSeekLLM, Settings } from "llamaindex";
import { Settings } from "llamaindex";
import { DeepSeekLLM } from "@llamaindex/deepseek";
Settings.llm = new DeepSeekLLM({
apiKey: "<YOUR_API_KEY>",
@@ -18,7 +19,8 @@ Settings.llm = new DeepSeekLLM({
## Example
```ts
import { DeepSeekLLM, Document, VectorStoreIndex, Settings } from "llamaindex";
import { Document, VectorStoreIndex, Settings } from "llamaindex";
import { DeepSeekLLM } from "@llamaindex/deepseek";
const deepseekLlm = new DeepSeekLLM({
apiKey: "<YOUR_API_KEY>",
@@ -7,7 +7,8 @@ title: Fireworks LLM
## Usage
```ts
import { FireworksLLM, Settings } from "llamaindex";
import { Settings } from "llamaindex";
import { FireworksLLM } from "@llamaindex/fireworks";
Settings.llm = new FireworksLLM({
apiKey: "<YOUR_API_KEY>",
@@ -23,7 +23,8 @@ import { Tab, Tabs } from "fumadocs-ui/components/tabs";
## Usage
```ts
import { Settings, TogetherLLM } from "llamaindex";
import { Settings } from "llamaindex";
import { TogetherLLM } from "@llamaindex/together";
Settings.llm = new TogetherLLM({
apiKey: "<YOUR_API_KEY>",
@@ -0,0 +1,55 @@
---
title: Tools
---
A "tool" is a utility that can be called by an agent on behalf of an LLM.
A tool can be called to perform custom actions, or retrieve extra information based on the LLM-generated input.
A result from a tool call can be used by subsequent steps in a workflow, or to compute a final answer.
For example, a "weather tool" could fetch some live weather information from a geographical location.
## Function tool
Function tools are implemented with the `FunctionTool` class.
A `FunctionTool` is constructed from a function with signature
```ts
(input: T, additionalArg?: AdditionalToolArgument) => R
```
where
- `input` is generated by the LLM, `T` is the type defined by the tool `parameters`
- `additionalArg` is an optional extra argument, see "Binding" below
- `R` is the return type
### Binding
An additional argument can be bound to a tool, each tool call will be passed
- the input provided by the LLM
- the additional argument (extends object)
Note: calling the `bind` method will return a new `FunctionTool` instance, without modifying the tool which `bind` is called on.
Example to pass a `userToken` as additional argument:
```ts
// first arg is LLM input, second is bound arg
const queryKnowledgeBase = async ({ question }, { userToken }) => {
const response = await fetch(`https://knowledge-base.com?token=${userToken}&query=${question}`);
// ...
};
// define tool as usual
const kbTool = FunctionTool.from(queryKnowledgeBase, {
name: 'queryKnowledgeBase',
description: 'Query knowledge base',
parameters: z.object({
question: z.string({
description: 'The user question',
}),
}),
});
// create an agent
const additionalArg = { userToken: 'abcd1234' };
const kbAgent = new LLMAgent({
tools: [kbTool.bind(additionalArg)],
// llm, systemPrompt etc
})
```
+2 -3
View File
@@ -1,11 +1,10 @@
import { docs, meta } from '../../.source';
import { createMDXSource } from 'fumadocs-mdx';
import { docs } from '@/.source';
import { loader } from 'fumadocs-core/source';
import { createOpenAPI } from "fumadocs-openapi/server";
export const source = loader({
baseUrl: '/docs',
source: createMDXSource(docs, meta),
source: docs.toFumadocsSource(),
});
export const openapi = createOpenAPI();
@@ -1,5 +1,3 @@
import { createPreset } from "fumadocs-ui/tailwind-plugin";
/** @type {import('tailwindcss').Config} */
export default {
darkMode: ["class"],
@@ -8,13 +6,7 @@ export default {
"./src/app/**/*.{ts,tsx}",
"./src/content/**/*.{md,mdx}",
"./src/mdx-components.{ts,tsx}",
"./node_modules/fumadocs-ui/dist/**/*.js",
"./node_modules/fumadocs-openapi/dist/**/*.js",
"./node_modules/@llamaindex/chat-ui/**/*.{ts,tsx}",
],
presets: [createPreset()],
// eslint-disable-next-line @typescript-eslint/no-require-imports
plugins: [require("tailwindcss-animate")],
theme: {
extend: {
borderRadius: {
+2 -1
View File
@@ -16,7 +16,8 @@
"jsx": "preserve",
"incremental": true,
"paths": {
"@/*": ["./src/*"]
"@/*": ["./src/*"],
"@/.source": ["./.source/index.ts"]
},
"plugins": [
{
+1 -1
View File
@@ -11,7 +11,7 @@
},
"devDependencies": {
"@cloudflare/workers-types": "^4.20241112.0",
"typescript": "^5.7.2",
"typescript": "^5.7.3",
"wrangler": "^3.89.0"
},
"dependencies": {
@@ -1,5 +1,37 @@
# @llamaindex/cloudflare-worker-agent-test
## 0.0.143
### Patch Changes
- llamaindex@0.9.9
## 0.0.142
### Patch Changes
- Updated dependencies [bbc8c87]
- llamaindex@0.9.8
## 0.0.141
### Patch Changes
- Updated dependencies [beb922b]
- llamaindex@0.9.7
## 0.0.140
### Patch Changes
- llamaindex@0.9.6
## 0.0.139
### Patch Changes
- llamaindex@0.9.5
## 0.0.138
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/cloudflare-worker-agent-test",
"version": "0.0.138",
"version": "0.0.143",
"type": "module",
"private": true,
"scripts": {
@@ -16,7 +16,7 @@
"@cloudflare/workers-types": "^4.20241112.0",
"@vitest/runner": "2.1.5",
"@vitest/snapshot": "2.1.5",
"typescript": "^5.7.2",
"typescript": "^5.7.3",
"vitest": "2.1.5",
"wrangler": "^3.87.0"
},
@@ -1,5 +1,29 @@
# @llamaindex/llama-parse-browser-test
## 0.0.53
### Patch Changes
- @llamaindex/cloud@3.0.8
## 0.0.52
### Patch Changes
- @llamaindex/cloud@3.0.7
## 0.0.51
### Patch Changes
- @llamaindex/cloud@3.0.6
## 0.0.50
### Patch Changes
- @llamaindex/cloud@3.0.5
## 0.0.49
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/llama-parse-browser-test",
"private": true,
"version": "0.0.49",
"version": "0.0.53",
"type": "module",
"scripts": {
"dev": "vite",
@@ -9,7 +9,7 @@
"preview": "vite preview"
},
"devDependencies": {
"typescript": "^5.7.2",
"typescript": "^5.7.3",
"vite": "^5.4.12",
"vite-plugin-wasm": "^3.3.0"
},
+32
View File
@@ -1,5 +1,37 @@
# @llamaindex/next-agent-test
## 0.1.143
### Patch Changes
- llamaindex@0.9.9
## 0.1.142
### Patch Changes
- Updated dependencies [bbc8c87]
- llamaindex@0.9.8
## 0.1.141
### Patch Changes
- Updated dependencies [beb922b]
- llamaindex@0.9.7
## 0.1.140
### Patch Changes
- llamaindex@0.9.6
## 0.1.139
### Patch Changes
- llamaindex@0.9.5
## 0.1.138
### Patch Changes
+5 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-agent-test",
"version": "0.1.138",
"version": "0.1.143",
"private": true,
"scripts": {
"dev": "next dev",
@@ -10,18 +10,16 @@
"dependencies": {
"ai": "^4.0.0",
"llamaindex": "workspace:*",
"next": "15.1.7",
"next": "15.2.0",
"react": "19.0.0",
"react-dom": "19.0.0"
},
"devDependencies": {
"@types/node": "^22.9.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"eslint": "9.16.0",
"eslint-config-next": "15.1.0",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.15",
"typescript": "^5.7.2"
"typescript": "^5.7.3"
}
}
@@ -1,8 +0,0 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
tailwindcss: {},
},
};
export default config;
@@ -1,3 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@@ -1,6 +1,5 @@
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
const inter = Inter({ subsets: ["latin"] });
@@ -1,20 +0,0 @@
import type { Config } from "tailwindcss";
const config: Config = {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
backgroundImage: {
"gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
"gradient-conic":
"conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
},
},
},
plugins: [],
};
export default config;
@@ -1,5 +1,37 @@
# test-edge-runtime
## 0.1.142
### Patch Changes
- llamaindex@0.9.9
## 0.1.141
### Patch Changes
- Updated dependencies [bbc8c87]
- llamaindex@0.9.8
## 0.1.140
### Patch Changes
- Updated dependencies [beb922b]
- llamaindex@0.9.7
## 0.1.139
### Patch Changes
- llamaindex@0.9.6
## 0.1.138
### Patch Changes
- llamaindex@0.9.5
## 0.1.137
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/nextjs-edge-runtime-test",
"version": "0.1.137",
"version": "0.1.142",
"private": true,
"scripts": {
"dev": "next dev",
@@ -9,14 +9,14 @@
},
"dependencies": {
"llamaindex": "workspace:*",
"next": "15.1.7",
"react": "^18.3.1",
"react-dom": "^18.3.1"
"next": "15.2.0",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"@types/node": "^22.9.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"typescript": "^5.7.2"
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"typescript": "^5.7.3"
}
}
@@ -1,5 +1,45 @@
# @llamaindex/next-node-runtime
## 0.1.9
### Patch Changes
- llamaindex@0.9.9
- @llamaindex/huggingface@0.0.43
- @llamaindex/readers@2.0.7
## 0.1.8
### Patch Changes
- Updated dependencies [bbc8c87]
- llamaindex@0.9.8
## 0.1.7
### Patch Changes
- Updated dependencies [beb922b]
- llamaindex@0.9.7
- @llamaindex/huggingface@0.0.42
- @llamaindex/readers@2.0.6
## 0.1.6
### Patch Changes
- llamaindex@0.9.6
- @llamaindex/huggingface@0.0.41
- @llamaindex/readers@2.0.5
## 0.1.5
### Patch Changes
- llamaindex@0.9.5
- @llamaindex/huggingface@0.0.40
- @llamaindex/readers@2.0.4
## 0.1.4
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-node-runtime-test",
"version": "0.1.4",
"version": "0.1.9",
"private": true,
"scripts": {
"dev": "next dev",
@@ -8,21 +8,19 @@
"start": "next start"
},
"dependencies": {
"llamaindex": "workspace:*",
"@llamaindex/huggingface": "workspace:*",
"@llamaindex/readers": "workspace:*",
"next": "15.1.7",
"llamaindex": "workspace:*",
"next": "15.2.0",
"react": "19.0.0",
"react-dom": "19.0.0"
},
"devDependencies": {
"@types/node": "^22.9.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"eslint": "9.16.0",
"eslint-config-next": "15.1.0",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.15",
"typescript": "^5.7.2"
"typescript": "^5.7.3"
}
}
@@ -1,8 +0,0 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
tailwindcss: {},
},
};
export default config;
@@ -1,3 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@@ -1,6 +1,5 @@
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import "./globals.css";
const inter = Inter({ subsets: ["latin"] });
@@ -1,20 +0,0 @@
import type { Config } from "tailwindcss";
const config: Config = {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
backgroundImage: {
"gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
"gradient-conic":
"conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
},
},
},
plugins: [],
};
export default config;
@@ -1,5 +1,37 @@
# vite-import-llamaindex
## 0.0.9
### Patch Changes
- llamaindex@0.9.9
## 0.0.8
### Patch Changes
- Updated dependencies [bbc8c87]
- llamaindex@0.9.8
## 0.0.7
### Patch Changes
- Updated dependencies [beb922b]
- llamaindex@0.9.7
## 0.0.6
### Patch Changes
- llamaindex@0.9.6
## 0.0.5
### Patch Changes
- llamaindex@0.9.5
## 0.0.4
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "vite-import-llamaindex",
"private": true,
"version": "0.0.4",
"version": "0.0.9",
"type": "module",
"scripts": {
"build": "vite build",
@@ -15,7 +15,7 @@
"devDependencies": {
"@size-limit/preset-big-lib": "^11.1.6",
"size-limit": "^11.1.6",
"typescript": "^5.7.2",
"typescript": "^5.7.3",
"vite": "^6.1.0"
},
"dependencies": {
@@ -1,5 +1,38 @@
# @llamaindex/waku-query-engine-test
## 0.0.143
### Patch Changes
- llamaindex@0.9.9
## 0.0.142
### Patch Changes
- Updated dependencies [bbc8c87]
- llamaindex@0.9.8
## 0.0.141
### Patch Changes
- Updated dependencies [beb922b]
- @llamaindex/env@0.1.29
- llamaindex@0.9.7
## 0.0.140
### Patch Changes
- llamaindex@0.9.6
## 0.0.139
### Patch Changes
- llamaindex@0.9.5
## 0.0.138
### Patch Changes
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/waku-query-engine-test",
"version": "0.0.138",
"version": "0.0.143",
"type": "module",
"private": true,
"scripts": {
@@ -17,10 +17,10 @@
"waku": "0.21.20"
},
"devDependencies": {
"@types/react": "18.3.12",
"@types/react-dom": "18.3.1",
"@types/react": "19.0.10",
"@types/react-dom": "19.0.4",
"autoprefixer": "^10.4.20",
"tailwindcss": "^3.4.15",
"typescript": "5.7.2"
"tailwindcss": "^4.0.9",
"typescript": "5.7.3"
}
}
@@ -1,7 +0,0 @@
/** @type {import('postcss-load-config').Config} */
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
@@ -0,0 +1,5 @@
export default {
plugins: {
"@tailwindcss/postcss": {},
},
};
@@ -1,4 +1,2 @@
@import url("https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,400;0,700;1,400;1,700&display=swap");
@tailwind base;
@tailwind components;
@tailwind utilities;
@import "tailwindcss";
+22 -38
View File
@@ -1,4 +1,5 @@
import { FunctionTool } from "llamaindex";
import { z } from "zod";
function sumNumbers({ a, b }: { a: number; b: number }) {
return `${a + b}`;
@@ -11,39 +12,27 @@ function divideNumbers({ a, b }: { a: number; b: number }) {
export const sumNumbersTool = FunctionTool.from(sumNumbers, {
name: "sumNumbers",
description: "Use this function to sum two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "The first number",
},
b: {
type: "number",
description: "The second number",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number({
description: "The first number",
}),
b: z.number({
description: "The second number",
}),
}),
});
export const divideNumbersTool = FunctionTool.from(divideNumbers, {
name: "divideNumbers",
description: "Use this function to divide two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "The first number",
},
b: {
type: "number",
description: "The second number",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number({
description: "The first number",
}),
b: z.number({
description: "The second number",
}),
}),
});
// should always return the 72 degrees
@@ -54,15 +43,10 @@ export const getWeatherTool = FunctionTool.from(
{
name: "getWeather",
description: "Get the weather for a city",
parameters: {
type: "object",
properties: {
city: {
type: "string",
description: "The city to get the weather for",
},
},
required: ["city"],
},
parameters: z.object({
city: z.string({
description: "The city to get the weather for",
}),
}),
},
);
+5 -4
View File
@@ -10,22 +10,23 @@
},
"devDependencies": {
"@faker-js/faker": "^9.2.0",
"@huggingface/transformers": "^3.0.2",
"@llamaindex/anthropic": "workspace:*",
"@llamaindex/clip": "workspace:*",
"@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*",
"@llamaindex/ollama": "workspace:*",
"@llamaindex/openai": "workspace:*",
"@llamaindex/pinecone": "workspace:*",
"@llamaindex/postgres": "workspace:*",
"@llamaindex/clip": "workspace:*",
"@llamaindex/anthropic": "workspace:*",
"@types/node": "^22.9.0",
"@types/pg": "^8.11.8",
"@huggingface/transformers": "^3.0.2",
"consola": "^3.2.3",
"dotenv": "^16.4.5",
"llamaindex": "workspace:*",
"pg": "^8.12.0",
"pgvector": "0.2.0",
"tsx": "^4.19.0"
"tsx": "^4.19.3",
"zod": "^3.24.2"
}
}
+178
View File
@@ -1,5 +1,183 @@
# examples
## 0.2.8
### Patch Changes
- Updated dependencies [58b3ee5]
- Updated dependencies [4bac71d]
- Updated dependencies [8bf1ca1]
- @llamaindex/google@0.1.0
- @llamaindex/core@0.5.7
- @llamaindex/anthropic@0.2.5
- @llamaindex/cloud@3.0.8
- llamaindex@0.9.9
- @llamaindex/node-parser@1.0.7
- @llamaindex/clip@0.0.43
- @llamaindex/cohere@0.0.12
- @llamaindex/deepinfra@0.0.43
- @llamaindex/huggingface@0.0.43
- @llamaindex/jinaai@0.0.3
- @llamaindex/mistral@0.0.12
- @llamaindex/mixedbread@0.0.12
- @llamaindex/ollama@0.0.47
- @llamaindex/openai@0.1.59
- @llamaindex/portkey-ai@0.0.40
- @llamaindex/replicate@0.0.40
- @llamaindex/astra@0.0.12
- @llamaindex/azure@0.1.7
- @llamaindex/chroma@0.0.12
- @llamaindex/firestore@1.0.5
- @llamaindex/milvus@0.1.7
- @llamaindex/mongodb@0.0.12
- @llamaindex/pinecone@0.0.12
- @llamaindex/postgres@0.0.40
- @llamaindex/qdrant@0.1.7
- @llamaindex/upstash@0.0.12
- @llamaindex/weaviate@0.0.12
- @llamaindex/vercel@0.0.18
- @llamaindex/voyage-ai@1.0.4
- @llamaindex/readers@2.0.7
- @llamaindex/workflow@0.0.15
- @llamaindex/deepseek@0.0.3
- @llamaindex/fireworks@0.0.3
- @llamaindex/groq@0.0.58
- @llamaindex/together@0.0.3
- @llamaindex/vllm@0.0.29
## 0.2.7
### Patch Changes
- Updated dependencies [4b49428]
- Updated dependencies [bbc8c87]
- Updated dependencies [7ee4968]
- @llamaindex/workflow@0.0.14
- llamaindex@0.9.8
- @llamaindex/deepseek@0.0.2
- @llamaindex/fireworks@0.0.2
- @llamaindex/together@0.0.2
- @llamaindex/jinaai@0.0.2
- @llamaindex/google@0.0.14
## 0.2.6
### Patch Changes
- Updated dependencies [beb922b]
- @llamaindex/env@0.1.29
- @llamaindex/core@0.5.6
- llamaindex@0.9.7
- @llamaindex/cloud@3.0.7
- @llamaindex/node-parser@1.0.6
- @llamaindex/anthropic@0.2.4
- @llamaindex/clip@0.0.42
- @llamaindex/cohere@0.0.11
- @llamaindex/deepinfra@0.0.42
- @llamaindex/google@0.0.13
- @llamaindex/groq@0.0.57
- @llamaindex/huggingface@0.0.42
- @llamaindex/mistral@0.0.11
- @llamaindex/mixedbread@0.0.11
- @llamaindex/ollama@0.0.46
- @llamaindex/openai@0.1.58
- @llamaindex/portkey-ai@0.0.39
- @llamaindex/replicate@0.0.39
- @llamaindex/astra@0.0.11
- @llamaindex/azure@0.1.6
- @llamaindex/chroma@0.0.11
- @llamaindex/firestore@1.0.4
- @llamaindex/milvus@0.1.6
- @llamaindex/mongodb@0.0.11
- @llamaindex/pinecone@0.0.11
- @llamaindex/postgres@0.0.39
- @llamaindex/qdrant@0.1.6
- @llamaindex/upstash@0.0.11
- @llamaindex/weaviate@0.0.11
- @llamaindex/voyage-ai@1.0.3
- @llamaindex/readers@2.0.6
- @llamaindex/workflow@0.0.13
- @llamaindex/vercel@0.0.17
- @llamaindex/vllm@0.0.28
## 0.2.5
### Patch Changes
- Updated dependencies [5668970]
- Updated dependencies [fd74ba4]
- @llamaindex/core@0.5.5
- @llamaindex/workflow@0.0.12
- @llamaindex/voyage-ai@1.0.2
- @llamaindex/cloud@3.0.6
- llamaindex@0.9.6
- @llamaindex/node-parser@1.0.5
- @llamaindex/anthropic@0.2.3
- @llamaindex/clip@0.0.41
- @llamaindex/cohere@0.0.10
- @llamaindex/deepinfra@0.0.41
- @llamaindex/google@0.0.12
- @llamaindex/huggingface@0.0.41
- @llamaindex/mistral@0.0.10
- @llamaindex/mixedbread@0.0.10
- @llamaindex/ollama@0.0.45
- @llamaindex/openai@0.1.57
- @llamaindex/portkey-ai@0.0.38
- @llamaindex/replicate@0.0.38
- @llamaindex/astra@0.0.10
- @llamaindex/azure@0.1.5
- @llamaindex/chroma@0.0.10
- @llamaindex/firestore@1.0.3
- @llamaindex/milvus@0.1.5
- @llamaindex/mongodb@0.0.10
- @llamaindex/pinecone@0.0.10
- @llamaindex/postgres@0.0.38
- @llamaindex/qdrant@0.1.5
- @llamaindex/upstash@0.0.10
- @llamaindex/weaviate@0.0.10
- @llamaindex/vercel@0.0.16
- @llamaindex/readers@2.0.5
- @llamaindex/groq@0.0.56
- @llamaindex/vllm@0.0.27
## 0.2.4
### Patch Changes
- Updated dependencies [ad3c7f1]
- @llamaindex/core@0.5.4
- @llamaindex/cloud@3.0.5
- llamaindex@0.9.5
- @llamaindex/node-parser@1.0.4
- @llamaindex/anthropic@0.2.2
- @llamaindex/clip@0.0.40
- @llamaindex/cohere@0.0.9
- @llamaindex/deepinfra@0.0.40
- @llamaindex/google@0.0.11
- @llamaindex/huggingface@0.0.40
- @llamaindex/mistral@0.0.9
- @llamaindex/mixedbread@0.0.9
- @llamaindex/ollama@0.0.44
- @llamaindex/openai@0.1.56
- @llamaindex/portkey-ai@0.0.37
- @llamaindex/replicate@0.0.37
- @llamaindex/astra@0.0.9
- @llamaindex/azure@0.1.4
- @llamaindex/chroma@0.0.9
- @llamaindex/firestore@1.0.2
- @llamaindex/milvus@0.1.4
- @llamaindex/mongodb@0.0.9
- @llamaindex/pinecone@0.0.9
- @llamaindex/postgres@0.0.37
- @llamaindex/qdrant@0.1.4
- @llamaindex/upstash@0.0.9
- @llamaindex/weaviate@0.0.9
- @llamaindex/vercel@0.0.15
- @llamaindex/voyage-ai@1.0.1
- @llamaindex/readers@2.0.4
- @llamaindex/groq@0.0.55
- @llamaindex/vllm@0.0.26
## 0.2.3
### Patch Changes
+19 -29
View File
@@ -1,5 +1,6 @@
import { OpenAI, OpenAIAgent } from "@llamaindex/openai";
import { FunctionTool } from "llamaindex";
import { OpenAI } from "@llamaindex/openai";
import { AgentWorkflow, FunctionTool } from "llamaindex";
import { z } from "zod";
const csvData =
"TITLE,RELEASE_YEAR,SCORE,NUMBER_OF_VOTES,DURATION,MAIN_GENRE,MAIN_PRODUCTION\nDavid Attenborough: A Life on Our Planet,2020,9,31180,83,documentary,GB\nInception,2010,8.8,2268288,148,scifi,GB\nForrest Gump,1994,8.8,1994599,142,drama,US\nAnbe Sivam,2003,8.7,20595,160,comedy,IN\nBo Burnham: Inside,2021,8.7,44074,87,comedy,US\nSaving Private Ryan,1998,8.6,1346020,169,drama,US\nDjango Unchained,2012,8.4,1472668,165,western,US\nDangal,2016,8.4,180247,161,action,IN\nBo Burnham: Make Happy,2016,8.4,14356,60,comedy,US\nLouis C.K.: Hilarious,2010,8.4,11973,84,comedy,US\nDave Chappelle: Sticks & Stones,2019,8.4,25687,65,comedy,US\n3 Idiots,2009,8.4,385782,170,comedy,IN\nBlack Friday,2004,8.4,20611,143,crime,IN\nSuper Deluxe,2019,8.4,13680,176,thriller,IN\nWinter on Fire: Ukraine's Fight for Freedom,2015,8.3,17710,98,documentary,UA\nOnce Upon a Time in America,1984,8.3,342335,229,drama,US\nTaxi Driver,1976,8.3,795222,113,crime,US\nLike Stars on Earth,2007,8.3,188234,165,drama,IN\nBo Burnham: What.,2013,8.3,11488,60,comedy,US\nFull Metal Jacket,1987,8.3,723306,116,drama,GB\nWarrior,2011,8.2,463276,140,drama,US\nDrishyam,2015,8.2,79075,163,thriller,IN\nQueen,2014,8.2,64805,146,drama,IN\nPaan Singh Tomar,2012,8.2,35888,135,drama,IN";
@@ -8,13 +9,9 @@ const userQuestion = "which are the best comedies after 2010?";
(async () => {
// The agent will succeed if we increase `maxTokens` to 1024
const llm = new OpenAI({ model: "gpt-4-turbo", maxTokens: 256 });
const llm = new OpenAI({ model: "gpt-4-turbo", maxTokens: 1024 });
type Input = {
code: string;
};
// initiate fake code interpreter
const interpreterTool = FunctionTool.from<Input>(
const interpreterTool = FunctionTool.from(
({ code }) => {
console.log(
`To answer the user's question, call the following code:\n${code}`,
@@ -25,41 +22,34 @@ const userQuestion = "which are the best comedies after 2010?";
name: "interpreter",
description:
"Execute python code in a Jupyter notebook cell and return any result, stdout, stderr, display_data, and error.",
parameters: {
type: "object",
properties: {
code: {
type: "string",
description: "The python code to execute in a single cell.",
},
},
required: ["code"],
},
parameters: z.object({
code: z.string({
description: "The python code to execute in a single cell.",
}),
}),
},
);
const systemPrompt =
"You are a Python interpreter.\n - You are given tasks to complete and you run python code to solve them.\n - The python code runs in a Jupyter notebook. Every time you call $(interpreter) tool, the python code is executed in a separate cell. It's okay to make multiple calls to $(interpreter).\n - Display visualizations using matplotlib or any other visualization library directly in the notebook. Shouldn't save the visualizations to a file, just return the base64 encoded data.\n - You can install any pip package (if it exists) if you need to but the usual packages for data analysis are already preinstalled.\n - You can run any python code you want in a secure environment.";
const agent = new OpenAIAgent({
llm,
const workflow = AgentWorkflow.fromTools({
tools: [interpreterTool],
llm,
verbose: false,
systemPrompt,
verbose: true,
});
console.log(`User question: ${userQuestion}\n`);
await agent.chat({
message: [
const result = await workflow.run(userQuestion, {
chatHistory: [
{
type: "text",
text: userQuestion,
},
{
type: "text",
text: `Use data from following CSV raw contents:\n${csvData}`,
role: "user",
content: `Use data from following CSV raw contents:\n${csvData}`,
},
],
});
console.log(result);
})();
+6 -10
View File
@@ -1,5 +1,6 @@
import { OpenAI } from "@llamaindex/openai";
import { FunctionTool, ToolCallOptions } from "llamaindex";
import { z } from "zod";
(async () => {
// The tool call will generate a partial JSON for `gpt-4-turbo`
@@ -27,16 +28,11 @@ async function callLLM(init: { model: string }) {
name: "interpreter",
description:
"Execute python code in a Jupyter notebook cell and return any result, stdout, stderr, display_data, and error.",
parameters: {
type: "object",
properties: {
code: {
type: "string",
description: "The python code to execute in a single cell.",
},
},
required: ["code"],
},
parameters: z.object({
code: z.string({
description: "The python code to execute in a single cell.",
}),
}),
},
);
+16 -36
View File
@@ -1,25 +1,16 @@
import { OpenAIAgent } from "@llamaindex/openai";
import { FunctionTool } from "llamaindex";
import { OpenAI } from "@llamaindex/openai";
import { AgentWorkflow, FunctionTool } from "llamaindex";
import { z } from "zod";
const sumNumbers = FunctionTool.from(
({ a, b }: { a: number; b: number }) => `${a + b}`,
{
name: "sumNumbers",
description: "Use this function to sum two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "The first number",
},
b: {
type: "number",
description: "The second number",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number().describe("The first number"),
b: z.number().describe("The second number"),
}),
},
);
@@ -28,33 +19,22 @@ const divideNumbers = FunctionTool.from(
{
name: "divideNumbers",
description: "Use this function to divide two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "The dividend a to divide",
},
b: {
type: "number",
description: "The divisor b to divide by",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number().describe("The dividend a to divide"),
b: z.number().describe("The divisor b to divide by"),
}),
},
);
async function main() {
const agent = new OpenAIAgent({
const workflow = AgentWorkflow.fromTools({
tools: [sumNumbers, divideNumbers],
llm: new OpenAI({ model: "gpt-4o-mini" }),
verbose: false,
});
const response = await agent.chat({
message: "How much is 5 + 5? then divide by 2",
});
console.log(response.message);
const response = await workflow.run("How much is 5 + 5? then divide by 2");
console.log(response.data);
}
void main().then(() => {
+4 -10
View File
@@ -6,6 +6,7 @@ import {
NodeWithScore,
VectorStoreIndex,
} from "llamaindex";
import { z } from "zod";
async function main() {
// Load the documents
@@ -32,16 +33,9 @@ async function main() {
{
name: "get_abramov_info",
description: "Get information about the Abramov documents",
parameters: {
type: "object",
properties: {
query: {
type: "string",
description: "The query about Abramov",
},
},
required: ["query"],
},
parameters: z.object({
query: z.string().describe("The query about Abramov"),
}),
},
);
+11 -31
View File
@@ -1,5 +1,6 @@
import { OpenAIAgent } from "@llamaindex/openai";
import { FunctionTool } from "llamaindex";
import { z } from "zod";
// Define a function to sum two numbers
function sumNumbers({ a, b }: { a: number; b: number }) {
@@ -11,50 +12,29 @@ function divideNumbers({ a, b }: { a: number; b: number }) {
return `${a / b}`;
}
// Define the parameters of the sum function as a JSON schema
const sumJSON = {
type: "object",
properties: {
a: {
type: "number",
description: "The first number",
},
b: {
type: "number",
description: "The second number",
},
},
required: ["a", "b"],
} as const;
const sumSchema = z.object({
a: z.number().describe("The first number"),
b: z.number().describe("The second number"),
});
const divideJSON = {
type: "object",
properties: {
a: {
type: "number",
description: "The dividend",
},
b: {
type: "number",
description: "The divisor",
},
},
required: ["a", "b"],
} as const;
const divideSchema = z.object({
a: z.number().describe("The dividend"),
b: z.number().describe("The divisor"),
});
async function main() {
// Create a function tool from the sum function
const functionTool = FunctionTool.from(sumNumbers, {
name: "sumNumbers",
description: "Use this function to sum two numbers",
parameters: sumJSON,
parameters: sumSchema,
});
// Create a function tool from the divide function
const functionTool2 = FunctionTool.from(divideNumbers, {
name: "divideNumbers",
description: "Use this function to divide two numbers",
parameters: divideJSON,
parameters: divideSchema,
});
// Create an OpenAIAgent with the function tools
+7 -20
View File
@@ -1,4 +1,5 @@
import { FunctionTool } from "llamaindex";
import { z } from "zod";
export const getCurrentIDTool = FunctionTool.from(
() => {
@@ -19,16 +20,9 @@ export const getUserInfoTool = FunctionTool.from(
{
name: "get_user_info",
description: "Get user info",
parameters: {
type: "object",
properties: {
userId: {
type: "string",
description: "The user id",
},
},
required: ["userId"],
},
parameters: z.object({
userId: z.string().describe("The user id"),
}),
},
);
@@ -40,15 +34,8 @@ export const getWeatherTool = FunctionTool.from(
{
name: "get_weather",
description: "Get the current weather for a location",
parameters: {
type: "object",
properties: {
address: {
type: "string",
description: "The address",
},
},
required: ["address"],
},
parameters: z.object({
address: z.string().describe("The address"),
}),
},
);
+14 -10
View File
@@ -1,24 +1,28 @@
import { OpenAI, OpenAIAgent } from "@llamaindex/openai";
import { OpenAI } from "@llamaindex/openai";
import { AgentStream, AgentWorkflow } from "llamaindex";
import { WikipediaTool } from "../wiki";
async function main() {
const llm = new OpenAI({ model: "gpt-4-turbo" });
const wikiTool = new WikipediaTool();
// Create an OpenAIAgent with the Wikipedia tool
const agent = new OpenAIAgent({
llm,
const workflow = AgentWorkflow.fromTools({
tools: [wikiTool],
llm,
verbose: false,
});
// Chat with the agent
const response = await agent.chat({
message: "Who was Goethe?",
stream: true,
});
const context = workflow.run("Who was Goethe?");
for await (const { delta } of response) {
process.stdout.write(delta);
for await (const event of context) {
if (event instanceof AgentStream) {
for (const chunk of event.data.delta) {
process.stdout.write(chunk);
}
} else {
console.log(event);
}
}
}
+83
View File
@@ -0,0 +1,83 @@
import { OpenAI } from "@llamaindex/openai";
import fs from "fs";
import {
AgentToolCall,
AgentToolCallResult,
AgentWorkflow,
FunctionAgent,
FunctionTool,
} from "llamaindex";
import os from "os";
import { z } from "zod";
import { WikipediaTool } from "../wiki";
const llm = new OpenAI({
model: "gpt-4o-mini",
});
const saveFileTool = FunctionTool.from(
({ content }: { content: string }) => {
const filePath = os.tmpdir() + "/report.md";
fs.writeFileSync(filePath, content);
return `File saved successfully at ${filePath}`;
},
{
name: "saveFile",
description:
"Save the written content into a file that can be downloaded by the user",
parameters: z.object({
content: z.string({
description: "The content to save into a file",
}),
}),
},
);
async function main() {
const reportAgent = new FunctionAgent({
name: "ReportAgent",
description:
"Responsible for crafting well-written blog posts based on research findings",
systemPrompt: `You are a professional writer. Your task is to create an engaging blog post using the research content provided. Once complete, save the post to a file using the saveFile tool.`,
tools: [saveFileTool],
llm,
});
const researchAgent = new FunctionAgent({
name: "ResearchAgent",
description:
"Responsible for gathering relevant information from the internet",
systemPrompt: `You are a research agent. Your role is to gather information from the internet using the provided tools and then transfer this information to the report agent for content creation.`,
tools: [new WikipediaTool()],
canHandoffTo: [reportAgent],
llm,
});
const workflow = new AgentWorkflow({
agents: [researchAgent, reportAgent],
rootAgent: researchAgent,
});
const context = workflow.run("Write a blog post about history of LLM");
let finalResult;
for await (const event of context) {
if (event instanceof AgentToolCall) {
console.log(
`[Agent ${event.displayName}] executing tool ${event.data.toolName} with parameters ${JSON.stringify(
event.data.toolKwargs,
)}`,
);
} else if (event instanceof AgentToolCallResult) {
console.log(
`[Agent ${event.displayName}] executed tool ${event.data.toolName} with result ${event.data.toolOutput.result}`,
);
}
finalResult = event;
}
console.log("Final result:", finalResult?.data);
}
main().catch((error) => {
console.error("Error:", error);
});
+110
View File
@@ -0,0 +1,110 @@
/**
* This example shows how to use AgentWorkflow with multiple agents
* 1. FetchWeatherAgent - Fetches the weather in a city
* 2. TemperatureConverterAgent - Converts the temperature from Fahrenheit to Celsius
*/
import { OpenAI } from "@llamaindex/openai";
import { StopEvent } from "@llamaindex/workflow";
import {
AgentInput,
AgentOutput,
AgentStream,
AgentToolCall,
AgentToolCallResult,
AgentWorkflow,
FunctionAgent,
FunctionTool,
} from "llamaindex";
import { z } from "zod";
const llm = new OpenAI({
model: "gpt-4o-mini",
});
// Define tools for the agents
const temperatureConverterTool = FunctionTool.from(
({ temperature }: { temperature: number }) => {
return ((temperature - 32) * 5) / 9;
},
{
description: "Convert a temperature from Fahrenheit to Celsius",
name: "fahrenheitToCelsius",
parameters: z.object({
temperature: z.number({
description: "The temperature in Fahrenheit",
}),
}),
},
);
const temperatureFetcherTool = FunctionTool.from(
({ city }: { city: string }) => {
const temperature = Math.floor(Math.random() * 58) + 32;
return `The current temperature in ${city} is ${temperature}°F`;
},
{
description: "Fetch the temperature (in Fahrenheit) for a city",
name: "fetchTemperature",
parameters: z.object({
city: z.string({
description: "The city to fetch the temperature for",
}),
}),
},
);
// Create agents
async function multiWeatherAgent() {
const converterAgent = new FunctionAgent({
name: "TemperatureConverterAgent",
description:
"An agent that can convert temperatures from Fahrenheit to Celsius.",
tools: [temperatureConverterTool],
llm,
});
const weatherAgent = new FunctionAgent({
name: "FetchWeatherAgent",
description: "An agent that can get the weather in a city. ",
systemPrompt:
"If you can't answer the user question, hand off to other agents.",
tools: [temperatureFetcherTool],
llm,
// Define which next agents can be called next if this agent cannot complete the task
// Can be passed as agent name, e.g. "TemperatureConverterAgent"
canHandoffTo: [converterAgent],
});
// Create agent workflow with the agents
const workflow = new AgentWorkflow({
agents: [weatherAgent, converterAgent],
rootAgent: weatherAgent,
verbose: false,
});
// Ask the agent to get the weather in a city
const context = workflow.run(
"What is the weather in San Francisco in Celsius?",
);
// Stream the events
for await (const event of context) {
// These events might be useful for UI
if (
event instanceof AgentToolCall ||
event instanceof AgentToolCallResult ||
event instanceof AgentOutput ||
event instanceof AgentInput ||
event instanceof StopEvent
) {
console.log(event);
} else if (event instanceof AgentStream) {
for (const chunk of event.data.delta) {
process.stdout.write(chunk);
}
}
}
}
multiWeatherAgent().catch((error) => {
console.error("Error:", error);
});
+37
View File
@@ -0,0 +1,37 @@
/**
* This example shows how to use AgentWorkflow as a single agent with tools
*/
import { OpenAI } from "@llamaindex/openai";
import { AgentWorkflow } from "llamaindex";
import { getWeatherTool } from "../agent/utils/tools";
const llm = new OpenAI({
model: "gpt-4o",
});
async function singleWeatherAgent() {
const workflow = AgentWorkflow.fromTools({
tools: [getWeatherTool],
llm,
verbose: false,
});
const workflowContext = workflow.run(
"What's the weather like in San Francisco?",
);
const sfResult = await workflowContext;
// The weather in San Francisco, CA is currently sunny.
console.log(`${JSON.stringify(sfResult, null, 2)}`);
// Reuse the context from the previous run
const workflowContext2 = workflow.run("Compare it with California?", {
context: workflowContext.data,
});
const caResult = await workflowContext2;
// Both San Francisco and California are currently experiencing sunny weather.
console.log(`${JSON.stringify(caResult, null, 2)}`);
}
singleWeatherAgent().catch((error) => {
console.error("Error:", error);
});
+114
View File
@@ -0,0 +1,114 @@
import fs from "fs";
import {
AgentToolCall,
AgentToolCallResult,
AgentWorkflow,
FunctionAgent,
FunctionTool,
} from "llamaindex";
import { z } from "zod";
import { Anthropic } from "@llamaindex/anthropic";
const llm = new Anthropic({
model: "claude-3-5-sonnet",
});
const weatherTool = FunctionTool.from(
(query: { location: string }) => {
return `The weather in ${query.location} is sunny`;
},
{
name: "weather",
description: "Get the weather",
parameters: z.object({
location: z.string({
description: "The location to get the weather for",
}),
}),
},
);
const inflationTool = FunctionTool.from(
(query: { location: string }) => {
return `The inflation in ${query.location} is 2%`;
},
{
name: "inflation",
description: "Get the inflation",
parameters: z.object({
location: z.string({
description: "The location to get the inflation for",
}),
}),
},
);
const saveFileTool = FunctionTool.from(
({ content }: { content: string }) => {
const filePath = "./report.md";
fs.writeFileSync(filePath, content);
return `File saved successfully at ${filePath}`;
},
{
name: "saveFile",
description:
"Save the written content into a file that can be downloaded by the user",
parameters: z.object({
content: z.string({
description: "The content to save into a file",
}),
}),
},
);
async function main() {
const reportAgent = new FunctionAgent({
name: "ReportAgent",
description:
"Responsible for creating concise reports about weather and inflation data",
systemPrompt: `You are a professional writer. Your task is to create a clear and concise report summarizing the weather and inflation data provided. Once complete, save the report to a file using the saveFile tool.`,
tools: [saveFileTool],
llm,
});
const researchAgent = new FunctionAgent({
name: "ResearchAgent",
description:
"Responsible for gathering relevant information from the internet",
systemPrompt: `You are a research agent. Your role is to gather information about the inflation and weather in the location provided.`,
tools: [inflationTool, weatherTool],
canHandoffTo: [reportAgent],
llm,
});
const workflow = new AgentWorkflow({
agents: [researchAgent, reportAgent],
rootAgent: researchAgent,
});
const context = workflow.run(
"Write a report about New York weather and inflation",
);
let finalResult;
for await (const event of context) {
if (event instanceof AgentToolCall) {
console.log(
`[Agent ${event.displayName}] executing tool ${event.data.toolName} with parameters ${JSON.stringify(
event.data.toolKwargs,
)}`,
);
} else if (event instanceof AgentToolCallResult) {
console.log(
`[Agent ${event.displayName}] executed tool ${event.data.toolName} with result ${event.data.toolOutput.result}`,
);
}
finalResult = event;
}
console.log("Final result:", finalResult?.data);
}
main().catch((error) => {
console.error("Error:", error);
});
+5 -11
View File
@@ -1,5 +1,6 @@
import { Anthropic, AnthropicAgent } from "@llamaindex/anthropic";
import { FunctionTool, Settings } from "llamaindex";
import { z } from "zod";
import { WikipediaTool } from "../wiki";
Settings.callbackManager.on("llm-tool-call", (event) => {
@@ -14,23 +15,16 @@ const anthropic = new Anthropic({
const agent = new AnthropicAgent({
llm: anthropic,
tools: [
FunctionTool.from<{ location: string }>(
FunctionTool.from(
(query) => {
return `The weather in ${query.location} is sunny`;
},
{
name: "weather",
description: "Get the weather",
parameters: {
type: "object",
properties: {
location: {
type: "string",
description: "The location to get the weather for",
},
},
required: ["location"],
},
parameters: z.object({
location: z.string().describe("The location to get the weather for"),
}),
},
),
new WikipediaTool(),
+25
View File
@@ -0,0 +1,25 @@
import { LLMAgent } from "llamaindex";
import { stdin as input, stdout as output } from "node:process";
import readline from "node:readline/promises";
const agent = new LLMAgent({ tools: [] });
(async () => {
const rl = readline.createInterface({ input, output });
while (true) {
const query = await rl.question("User: ");
const startTime = Date.now();
const stream = await agent.chat({ message: query, stream: true });
const timeToGetFirstChunk = Date.now() - startTime;
process.stdout.write(
`Time to get first chunk from LLMAgent: ${timeToGetFirstChunk}ms\n`,
);
process.stdout.write("Assistant with LLMAgent: ");
for await (const chunk of stream) {
process.stdout.write(chunk.response);
}
process.stdout.write("\n");
}
})();
+46
View File
@@ -0,0 +1,46 @@
import { DeepSeekLLM } from "@llamaindex/deepseek";
// process.env.DEEPSEEK_API_KEY is required
const deepseek = new DeepSeekLLM({
apiKey: process.env.DEEPSEEK_API_KEY,
model: "deepseek-coder", // or "deepseek-chat"
});
(async () => {
// Example of non-streaming chat
const response = await deepseek.chat({
messages: [
{
role: "system",
content: "You are an AI assistant",
},
{
role: "user",
content: "Tell me about San Francisco",
},
],
stream: false,
});
console.log("Response from DeepSeek AI:");
console.log(response);
// Example of streaming chat
const generator = await deepseek.chat({
messages: [
{
role: "system",
content: "You are an AI assistant",
},
{
role: "user",
content: "Write a short poem about San Francisco",
},
],
stream: true,
});
console.log("\nStreaming response from DeepSeek AI...");
for await (const message of generator) {
process.stdout.write(message.delta);
}
console.log("\n");
})();
+13 -42
View File
@@ -1,5 +1,6 @@
import { Gemini, GEMINI_MODEL } from "@llamaindex/google";
import { FunctionTool, LLMAgent, Settings } from "llamaindex";
import { z } from "zod";
Settings.callbackManager.on("llm-tool-call", (event) => {
console.log(event.detail);
@@ -14,20 +15,10 @@ const sumNumbers = FunctionTool.from(
{
name: "sumNumbers",
description: "Use this function to sum two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "The first number",
},
b: {
type: "number",
description: "The second number",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number().describe("The first number"),
b: z.number().describe("The second number"),
}),
},
);
@@ -36,20 +27,10 @@ const divideNumbers = FunctionTool.from(
{
name: "divideNumbers",
description: "Use this function to divide two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "The dividend a to divide",
},
b: {
type: "number",
description: "The divisor b to divide by",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number().describe("The dividend a to divide"),
b: z.number().describe("The divisor b to divide by"),
}),
},
);
@@ -58,20 +39,10 @@ const subtractNumbers = FunctionTool.from(
{
name: "subtractNumbers",
description: "Use this function to subtract two numbers",
parameters: {
type: "object",
properties: {
a: {
type: "number",
description: "The number to subtract from",
},
b: {
type: "number",
description: "The number to subtract",
},
},
required: ["a", "b"],
},
parameters: z.object({
a: z.number().describe("The number to subtract from"),
b: z.number().describe("The number to subtract"),
}),
},
);
+2 -6
View File
@@ -1,10 +1,6 @@
import { JinaAIEmbedding } from "@llamaindex/jinaai";
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
import {
ImageDocument,
JinaAIEmbedding,
similarity,
SimilarityType,
} from "llamaindex";
import { ImageDocument, similarity, SimilarityType } from "llamaindex";
import path from "path";
async function main() {
+43 -39
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/examples",
"version": "0.2.3",
"version": "0.2.8",
"private": true,
"scripts": {
"lint": "eslint .",
@@ -11,39 +11,43 @@
"@azure/cosmos": "^4.1.1",
"@azure/identity": "^4.4.1",
"@azure/search-documents": "^12.1.0",
"@llamaindex/anthropic": "^0.2.1",
"@llamaindex/astra": "^0.0.8",
"@llamaindex/azure": "^0.1.3",
"@llamaindex/chroma": "^0.0.8",
"@llamaindex/clip": "^0.0.39",
"@llamaindex/cloud": "^3.0.4",
"@llamaindex/cohere": "^0.0.8",
"@llamaindex/core": "^0.5.3",
"@llamaindex/deepinfra": "^0.0.39",
"@llamaindex/env": "^0.1.28",
"@llamaindex/firestore": "^1.0.1",
"@llamaindex/google": "^0.0.10",
"@llamaindex/groq": "^0.0.54",
"@llamaindex/huggingface": "^0.0.39",
"@llamaindex/milvus": "^0.1.3",
"@llamaindex/mistral": "^0.0.8",
"@llamaindex/mixedbread": "^0.0.8",
"@llamaindex/mongodb": "^0.0.8",
"@llamaindex/node-parser": "^1.0.3",
"@llamaindex/ollama": "^0.0.43",
"@llamaindex/openai": "^0.1.55",
"@llamaindex/pinecone": "^0.0.8",
"@llamaindex/portkey-ai": "^0.0.36",
"@llamaindex/postgres": "^0.0.36",
"@llamaindex/qdrant": "^0.1.3",
"@llamaindex/readers": "^2.0.3",
"@llamaindex/replicate": "^0.0.36",
"@llamaindex/upstash": "^0.0.8",
"@llamaindex/vercel": "^0.0.14",
"@llamaindex/vllm": "^0.0.25",
"@llamaindex/voyage-ai": "^1.0.0",
"@llamaindex/weaviate": "^0.0.8",
"@llamaindex/workflow": "^0.0.11",
"@llamaindex/anthropic": "^0.2.5",
"@llamaindex/astra": "^0.0.12",
"@llamaindex/azure": "^0.1.7",
"@llamaindex/chroma": "^0.0.12",
"@llamaindex/clip": "^0.0.43",
"@llamaindex/cloud": "^3.0.8",
"@llamaindex/cohere": "^0.0.12",
"@llamaindex/core": "^0.5.7",
"@llamaindex/deepinfra": "^0.0.43",
"@llamaindex/env": "^0.1.29",
"@llamaindex/firestore": "^1.0.5",
"@llamaindex/google": "^0.1.0",
"@llamaindex/groq": "^0.0.58",
"@llamaindex/huggingface": "^0.0.43",
"@llamaindex/milvus": "^0.1.7",
"@llamaindex/mistral": "^0.0.12",
"@llamaindex/mixedbread": "^0.0.12",
"@llamaindex/mongodb": "^0.0.12",
"@llamaindex/node-parser": "^1.0.7",
"@llamaindex/ollama": "^0.0.47",
"@llamaindex/openai": "^0.1.59",
"@llamaindex/pinecone": "^0.0.12",
"@llamaindex/portkey-ai": "^0.0.40",
"@llamaindex/postgres": "^0.0.40",
"@llamaindex/qdrant": "^0.1.7",
"@llamaindex/readers": "^2.0.7",
"@llamaindex/replicate": "^0.0.40",
"@llamaindex/upstash": "^0.0.12",
"@llamaindex/vercel": "^0.0.18",
"@llamaindex/vllm": "^0.0.29",
"@llamaindex/voyage-ai": "^1.0.4",
"@llamaindex/weaviate": "^0.0.12",
"@llamaindex/workflow": "^0.0.15",
"@llamaindex/deepseek": "^0.0.3",
"@llamaindex/fireworks": "^0.0.3",
"@llamaindex/together": "^0.0.3",
"@llamaindex/jinaai": "^0.0.3",
"@notionhq/client": "^2.2.15",
"@pinecone-database/pinecone": "^4.0.0",
"@vercel/postgres": "^0.10.0",
@@ -52,16 +56,16 @@
"commander": "^12.1.0",
"dotenv": "^16.4.5",
"js-tiktoken": "^1.0.14",
"llamaindex": "^0.9.4",
"llamaindex": "^0.9.9",
"mongodb": "6.7.0",
"pathe": "^1.1.2",
"postgres": "^3.4.4",
"wikipedia": "^2.1.2"
"wikipedia": "^2.1.2",
"zod": "^3.23.8"
},
"devDependencies": {
"@types/node": "^22.9.0",
"tsx": "^4.19.0",
"typescript": "^5.7.2"
"tsx": "^4.19.3",
"typescript": "^5.7.3"
},
"stackblitz": {
"startCommand": "npm start"
+33
View File
@@ -0,0 +1,33 @@
import {
GEMINI_EMBEDDING_MODEL,
GeminiEmbedding,
GeminiSession,
} from "@llamaindex/google";
import { QdrantVectorStore } from "@llamaindex/qdrant";
import {
Document,
storageContextFromDefaults,
VectorStoreIndex,
} from "llamaindex";
const embedding = new GeminiEmbedding({
model: GEMINI_EMBEDDING_MODEL.EMBEDDING_001,
session: new GeminiSession({
apiKey: process.env.GEMINI_API_KEY,
}),
});
async function main() {
const docs = [new Document({ text: "Lorem ipsum dolor sit amet" })];
const vectorStore = new QdrantVectorStore({
url: process.env.QDRANT_URL,
apiKey: process.env.QDRANT_API_KEY,
embeddingModel: embedding,
collectionName: "gemini_test",
});
const storageContext = await storageContextFromDefaults({ vectorStore });
await VectorStoreIndex.fromDocuments(docs, { storageContext });
console.log("Inizialized vector store successfully");
}
void main().catch((err) => console.error(err));
+27
View File
@@ -0,0 +1,27 @@
import { JinaAIEmbedding } from "@llamaindex/jinaai";
import { QdrantVectorStore } from "@llamaindex/qdrant";
import {
Document,
storageContextFromDefaults,
VectorStoreIndex,
} from "llamaindex";
const embedding = new JinaAIEmbedding({
apiKey: process.env.JINAAI_API_KEY,
model: "jina-embeddings-v3",
});
async function main() {
const docs = [new Document({ text: "Lorem ipsum dolor sit amet" })];
const vectorStore = new QdrantVectorStore({
url: process.env.QDRANT_URL,
apiKey: process.env.QDRANT_API_KEY,
embeddingModel: embedding,
collectionName: "jina_test",
});
const storageContext = await storageContextFromDefaults({ vectorStore });
await VectorStoreIndex.fromDocuments(docs, { storageContext });
console.log("Inizialized vector store successfully");
}
void main().catch((err) => console.error(err));
+2 -2
View File
@@ -25,7 +25,7 @@
},
"devDependencies": {
"@types/node": "^22.9.0",
"tsx": "^4.19.0",
"typescript": "^5.7.2"
"tsx": "^4.19.3",
"typescript": "^5.7.3"
}
}
+2 -1
View File
@@ -1,5 +1,6 @@
import { FireworksEmbedding, FireworksLLM } from "@llamaindex/fireworks";
import { PDFReader } from "@llamaindex/readers/pdf";
import { FireworksEmbedding, FireworksLLM, VectorStoreIndex } from "llamaindex";
import { VectorStoreIndex } from "llamaindex";
import { Settings } from "llamaindex";
+1 -1
View File
@@ -1,4 +1,4 @@
import { TogetherEmbedding, TogetherLLM } from "llamaindex";
import { TogetherEmbedding, TogetherLLM } from "@llamaindex/together";
// process.env.TOGETHER_API_KEY is required
const together = new TogetherLLM({
+2 -7
View File
@@ -1,12 +1,7 @@
import fs from "node:fs/promises";
import {
Document,
Settings,
TogetherEmbedding,
TogetherLLM,
VectorStoreIndex,
} from "llamaindex";
import { TogetherEmbedding, TogetherLLM } from "@llamaindex/together";
import { Document, Settings, VectorStoreIndex } from "llamaindex";
// Update llm to use TogetherAI
Settings.llm = new TogetherLLM({
+1 -1
View File
@@ -15,7 +15,7 @@ async function main() {
tools: [
{
metadata: {
name: "wikipedia_tool",
name: "wikipedia_search",
description: "A tool that uses a query engine to search Wikipedia.",
parameters: {
type: "object",
+1 -1
View File
@@ -14,7 +14,7 @@ type WikipediaToolParams = {
};
const DEFAULT_META_DATA: ToolMetadata<JSONSchemaType<WikipediaParameter>> = {
name: "wikipedia_tool",
name: "wikipedia_search",
description: "A tool that uses a query engine to search Wikipedia.",
parameters: {
type: "object",
+3 -3
View File
@@ -21,7 +21,7 @@
},
"devDependencies": {
"@changesets/cli": "^2.27.5",
"eslint": "9.16.0",
"eslint": "9.22.0",
"eslint-config-next": "^15.1.0",
"eslint-config-prettier": "^9.1.0",
"eslint-config-turbo": "^2.3.3",
@@ -32,8 +32,8 @@
"madge": "^8.0.0",
"prettier": "^3.4.2",
"prettier-plugin-organize-imports": "^4.1.0",
"turbo": "^2.3.3",
"typescript": "^5.7.2",
"turbo": "^2.4.4",
"typescript": "^5.7.3",
"typescript-eslint": "^8.18.0"
},
"packageManager": "pnpm@9.12.3",
+32
View File
@@ -1,5 +1,37 @@
# @llamaindex/autotool
## 6.0.9
### Patch Changes
- llamaindex@0.9.9
## 6.0.8
### Patch Changes
- Updated dependencies [bbc8c87]
- llamaindex@0.9.8
## 6.0.7
### Patch Changes
- Updated dependencies [beb922b]
- llamaindex@0.9.7
## 6.0.6
### Patch Changes
- llamaindex@0.9.6
## 6.0.5
### Patch Changes
- llamaindex@0.9.5
## 6.0.4
### Patch Changes
@@ -1,5 +1,42 @@
# @llamaindex/autotool-01-node-example
## 0.0.90
### Patch Changes
- llamaindex@0.9.9
- @llamaindex/autotool@6.0.9
## 0.0.89
### Patch Changes
- Updated dependencies [bbc8c87]
- llamaindex@0.9.8
- @llamaindex/autotool@6.0.8
## 0.0.88
### Patch Changes
- Updated dependencies [beb922b]
- llamaindex@0.9.7
- @llamaindex/autotool@6.0.7
## 0.0.87
### Patch Changes
- llamaindex@0.9.6
- @llamaindex/autotool@6.0.6
## 0.0.86
### Patch Changes
- llamaindex@0.9.5
- @llamaindex/autotool@6.0.5
## 0.0.85
### Patch Changes
@@ -8,10 +8,10 @@
"openai": "^4.73.1"
},
"devDependencies": {
"tsx": "^4.19.0"
"tsx": "^4.19.3"
},
"scripts": {
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
},
"version": "0.0.85"
"version": "0.0.90"
}
@@ -1,3 +0,0 @@
# Rename this file to `.env.local` to use environment variables locally with `next dev`
# https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables
MY_HOST="example.com"
@@ -1,35 +0,0 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env*.local
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
File diff suppressed because it is too large Load Diff
@@ -1,30 +0,0 @@
This is a [LlamaIndex](https://www.llamaindex.ai/) project using [Next.js](https://nextjs.org/) bootstrapped with [`create-llama`](https://github.com/run-llama/LlamaIndexTS/tree/main/packages/create-llama).
## Getting Started
First, install the dependencies:
```
npm install
```
Second, run the development server:
```
npm run dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
## Learn More
To learn more about LlamaIndex, take a look at the following resources:
- [LlamaIndex Documentation](https://docs.llamaindex.ai) - learn about LlamaIndex (Python features).
- [LlamaIndexTS Documentation](https://ts.llamaindex.ai) - learn about LlamaIndex (Typescript features).
You can check out [the LlamaIndexTS GitHub repository](https://github.com/run-llama/LlamaIndexTS) - your feedback and contributions are welcome!
@@ -1,38 +0,0 @@
"use server";
import { OpenAIAgent } from "llamaindex";
// import your tools on top, that's it
import { runWithStreamableUI } from "@/context";
import "@/tool";
import { convertTools } from "@llamaindex/autotool";
import { createStreamableUI } from "ai/rsc";
import type { ReactNode } from "react";
export async function chatWithAI(message: string): Promise<ReactNode> {
const agent = new OpenAIAgent({
tools: convertTools("llamaindex"),
});
const uiStream = createStreamableUI();
runWithStreamableUI(uiStream, () =>
agent
.chat({
stream: true,
message,
})
.then(async (responseStream) => {
return responseStream.pipeTo(
new WritableStream({
start: () => {
uiStream.append("\n");
},
write: async (message) => {
uiStream.append(message.response);
},
close: () => {
uiStream.done();
},
}),
);
}),
).catch(uiStream.error);
return uiStream.value;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

@@ -1,91 +0,0 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 47.4% 11.2%;
--muted: 210 40% 96.1%;
--muted-foreground: 215.4 16.3% 46.9%;
--popover: 0 0% 100%;
--popover-foreground: 222.2 47.4% 11.2%;
--border: 214.3 31.8% 91.4%;
--input: 214.3 31.8% 91.4%;
--card: 0 0% 100%;
--card-foreground: 222.2 47.4% 11.2%;
--primary: 222.2 47.4% 11.2%;
--primary-foreground: 210 40% 98%;
--secondary: 210 40% 96.1%;
--secondary-foreground: 222.2 47.4% 11.2%;
--accent: 210 40% 96.1%;
--accent-foreground: 222.2 47.4% 11.2%;
--destructive: 0 100% 50%;
--destructive-foreground: 210 40% 98%;
--ring: 215 20.2% 65.1%;
--radius: 0.5rem;
}
.dark {
--background: 224 71% 4%;
--foreground: 213 31% 91%;
--muted: 223 47% 11%;
--muted-foreground: 215.4 16.3% 56.9%;
--accent: 216 34% 17%;
--accent-foreground: 210 40% 98%;
--popover: 224 71% 4%;
--popover-foreground: 215 20.2% 65.1%;
--border: 216 34% 17%;
--input: 216 34% 17%;
--card: 224 71% 4%;
--card-foreground: 213 31% 91%;
--primary: 210 40% 98%;
--primary-foreground: 222.2 47.4% 1.2%;
--secondary: 222.2 47.4% 11.2%;
--secondary-foreground: 210 40% 98%;
--destructive: 0 63% 31%;
--destructive-foreground: 210 40% 98%;
--ring: 216 34% 17%;
--radius: 0.5rem;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
font-feature-settings:
"rlig" 1,
"calt" 1;
}
.background-gradient {
background-color: #fff;
background-image:
radial-gradient(at 21% 11%, rgba(186, 186, 233, 0.53) 0, transparent 50%),
radial-gradient(at 85% 0, hsla(46, 57%, 78%, 0.52) 0, transparent 50%),
radial-gradient(at 91% 36%, rgba(194, 213, 255, 0.68) 0, transparent 50%),
radial-gradient(at 8% 40%, rgba(251, 218, 239, 0.46) 0, transparent 50%);
}
}
@@ -1,26 +0,0 @@
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import { Toaster } from "sonner";
import "./globals.css";
const inter = Inter({ subsets: ["latin"] });
export const metadata: Metadata = {
title: "Create Llama App",
description: "Generated by create-llama",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body className={inter.className}>
<Toaster />
{children}
</body>
</html>
);
}
@@ -1,11 +0,0 @@
import { ChatSection } from "@/components/chat-section";
export const runtime = "edge";
export default function Home() {
return (
<main className="flex min-h-screen flex-col items-center gap-10 p-24 background-gradient">
<ChatSection />
</main>
);
}

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