mirror of
https://github.com/run-llama/LlamaIndexTS.git
synced 2026-07-01 22:14:03 -04:00
Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5cce681f62 | |||
| 48b0d88941 | |||
| f18577263a | |||
| 214e133e92 | |||
| ae58862669 | |||
| 5a0ed1f990 | |||
| 36773a82b6 | |||
| 891562d598 | |||
| 93852e15fd | |||
| e1320b08a8 | |||
| 8eeac3310f | |||
| 984a573068 | |||
| f0160d9646 | |||
| 39758ab018 | |||
| f631d4f7d6 | |||
| d68c2a4be8 | |||
| 47a7555c07 | |||
| 363bfa778e | |||
| 229cdeb0ff | |||
| 7a2485cca2 | |||
| 1329186a23 | |||
| 5d6e7384f5 | |||
| f2dfd305fb | |||
| 3cd8a573df | |||
| 09c6077f6e | |||
| 14cc65b4e3 | |||
| c544d8f67c | |||
| d578889e21 | |||
| 9f745d1941 | |||
| f292e94dcd | |||
| 0fcc92f632 | |||
| 515a8b9111 | |||
| 7e8efc6284 | |||
| 0fcf65126d |
+55
-2
@@ -25,7 +25,7 @@ Make sure you have Node.js LTS (Long-term Support) installed. You can check your
|
||||
|
||||
```shell
|
||||
node -v
|
||||
# v20.x.x
|
||||
# v22.x.x
|
||||
```
|
||||
|
||||
### Use pnpm
|
||||
@@ -38,6 +38,7 @@ npm install -g pnpm
|
||||
|
||||
```shell
|
||||
pnpm install
|
||||
pnpm install -g tsx
|
||||
```
|
||||
|
||||
### Build the packages
|
||||
@@ -48,6 +49,56 @@ To build all packages, run:
|
||||
pnpm build
|
||||
```
|
||||
|
||||
### Start Developing
|
||||
|
||||
You can launch the package in dev-mode by running:
|
||||
|
||||
```shell
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
This will use turbo to run all packages in watch-mode. This means you can make changes and have them automatically built.
|
||||
|
||||
If you want to customize what packages are built/watched, you can run turbo directly and adjust the filter:
|
||||
|
||||
```shell
|
||||
pnpm turbo run dev --filter="./packages/core" --concurrency=100
|
||||
```
|
||||
|
||||
In another terminal, you can write and run any script needed to quickly test your changes. For example:
|
||||
|
||||
```typescript
|
||||
import { createMemory, staticBlock } from "@llamaindex/core/memory";
|
||||
|
||||
// Create memory with predefined context
|
||||
const memory = createMemory({
|
||||
memoryBlocks: [
|
||||
staticBlock({
|
||||
content:
|
||||
"The user is a software engineer who loves TypeScript and LlamaIndex.",
|
||||
messageRole: "system",
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
async function main() {
|
||||
const result = await memory.getLLM();
|
||||
console.log(result);
|
||||
}
|
||||
|
||||
void main().catch(console.error);
|
||||
```
|
||||
|
||||
And run it with:
|
||||
|
||||
```shell
|
||||
pnpm exec tsx my_script.ts
|
||||
```
|
||||
|
||||
This flow allows you to easily test your changes without having to build the entire project.
|
||||
|
||||
Once you are happy with your changes, be sure to add tests (and confirm existing tests are passing!).
|
||||
|
||||
### Run tests
|
||||
|
||||
#### Unit tests
|
||||
@@ -92,7 +143,7 @@ Before sending a PR, make sure of the following:
|
||||
3. If you have a new feature, add a new example in the `examples` folder.
|
||||
4. You have a descriptive changeset for each PR:
|
||||
|
||||
### Changesets
|
||||
### Bumping the versions of packages you've modified
|
||||
|
||||
We use [changesets](https://github.com/changesets/changesets) for managing versions and changelogs. To create a new
|
||||
changeset, run in the root folder:
|
||||
@@ -101,6 +152,8 @@ changeset, run in the root folder:
|
||||
pnpm changeset
|
||||
```
|
||||
|
||||
You will be prompted to choose what packages need their versions bumped, and what kind of bump (major, minor or patch) is needed. Once you carry out this operation, the bumping will be automatic after the PR is merged.
|
||||
|
||||
## Publishing (maintainers only)
|
||||
|
||||
The [Release Github Action](.github/workflows/release.yml) is automatically generating and updating a
|
||||
|
||||
@@ -1,5 +1,58 @@
|
||||
# @llamaindex/doc
|
||||
|
||||
## 0.2.36
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [48b0d88]
|
||||
- Updated dependencies [f185772]
|
||||
- @llamaindex/cloud@4.0.20
|
||||
- llamaindex@0.11.15
|
||||
|
||||
## 0.2.35
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [5a0ed1f]
|
||||
- Updated dependencies [5a0ed1f]
|
||||
- Updated dependencies [8eeac33]
|
||||
- @llamaindex/cloud@4.0.19
|
||||
- @llamaindex/core@0.6.14
|
||||
- llamaindex@0.11.14
|
||||
- @llamaindex/node-parser@2.0.14
|
||||
- @llamaindex/openai@0.4.8
|
||||
- @llamaindex/readers@3.1.13
|
||||
- @llamaindex/workflow@1.1.14
|
||||
|
||||
## 0.2.34
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 39758ab: Add title to homepage header
|
||||
|
||||
## 0.2.33
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [47a7555]
|
||||
- @llamaindex/cloud@4.0.18
|
||||
- llamaindex@0.11.13
|
||||
|
||||
## 0.2.32
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [d578889]
|
||||
- Updated dependencies [0fcc92f]
|
||||
- Updated dependencies [515a8b9]
|
||||
- @llamaindex/core@0.6.13
|
||||
- llamaindex@0.11.12
|
||||
- @llamaindex/cloud@4.0.17
|
||||
- @llamaindex/node-parser@2.0.13
|
||||
- @llamaindex/openai@0.4.7
|
||||
- @llamaindex/readers@3.1.12
|
||||
- @llamaindex/workflow@1.1.13
|
||||
|
||||
## 0.2.31
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
This is a Next.js application generated with
|
||||
[Create Fumadocs](https://github.com/fuma-nama/fumadocs).
|
||||
|
||||
> Note: Before running the development server, make sure to build the whole project first, see [CONTRIBUTING.md](../../CONTRIBUTING.md) for more details.
|
||||
|
||||
Run development server:
|
||||
|
||||
```bash
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
},
|
||||
"aliases": {
|
||||
"components": "@/components",
|
||||
"utils": "@/lib/utils",
|
||||
"utils": "@/libs/utils",
|
||||
"ui": "@/components/ui",
|
||||
"lib": "@/lib",
|
||||
"lib": "@/libs",
|
||||
"hooks": "@/hooks"
|
||||
}
|
||||
}
|
||||
|
||||
+13
-12
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/doc",
|
||||
"version": "0.2.31",
|
||||
"version": "0.2.36",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"postinstall": "fumadocs-mdx",
|
||||
@@ -15,7 +15,6 @@
|
||||
"dependencies": {
|
||||
"@huggingface/transformers": "^3.5.0",
|
||||
"@icons-pack/react-simple-icons": "^10.1.0",
|
||||
"@llamaindex/workflow-docs": "0.1.1",
|
||||
"@llamaindex/chat-ui-docs": "^0.0.5",
|
||||
"@llamaindex/cloud": "workspace:*",
|
||||
"@llamaindex/core": "workspace:*",
|
||||
@@ -23,8 +22,10 @@
|
||||
"@llamaindex/openai": "workspace:*",
|
||||
"@llamaindex/readers": "workspace:*",
|
||||
"@llamaindex/workflow": "workspace:*",
|
||||
"@llamaindex/workflow-docs": "0.1.1",
|
||||
"@mdx-js/mdx": "^3.1.0",
|
||||
"@monaco-editor/react": "^4.7.0",
|
||||
"@next/third-parties": "^15.3.4",
|
||||
"@number-flow/react": "^0.3.4",
|
||||
"@radix-ui/react-dialog": "^1.1.2",
|
||||
"@radix-ui/react-icons": "^1.3.2",
|
||||
@@ -34,7 +35,7 @@
|
||||
"@radix-ui/react-tooltip": "^1.1.4",
|
||||
"@scalar/api-client-react": "^1.1.25",
|
||||
"@vercel/functions": "^1.5.0",
|
||||
"ai": "^3.4.33",
|
||||
"ai": "^4.3.17",
|
||||
"class-variance-authority": "^0.7.0",
|
||||
"clsx": "2.1.1",
|
||||
"foxact": "^0.2.41",
|
||||
@@ -49,7 +50,7 @@
|
||||
"hast-util-to-jsx-runtime": "^2.3.2",
|
||||
"llamaindex": "workspace:*",
|
||||
"lucide-react": "^0.460.0",
|
||||
"next": "^15.3.0",
|
||||
"next": "^15.3.3",
|
||||
"next-themes": "^0.4.3",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0",
|
||||
@@ -69,30 +70,30 @@
|
||||
"twoslash": "^0.3.1",
|
||||
"use-stick-to-bottom": "^1.0.42",
|
||||
"web-tree-sitter": "^0.24.4",
|
||||
"zod": "^3.25.67"
|
||||
"zod": "^3.25.76"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@next/env": "^15.3.0",
|
||||
"@tailwindcss/postcss": "^4.0.9",
|
||||
"@types/mdx": "^2.0.13",
|
||||
"@types/node": "22.9.0",
|
||||
"@types/react": "^19.0.10",
|
||||
"@types/react-dom": "^19.0.4",
|
||||
"@types/node": "24.0.13",
|
||||
"@types/react": "^19.1.8",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"autoprefixer": "^10.4.20",
|
||||
"cross-env": "^7.0.3",
|
||||
"fast-glob": "^3.3.2",
|
||||
"gray-matter": "^4.0.3",
|
||||
"postcss": "^8.5.3",
|
||||
"postcss": "^8.5.6",
|
||||
"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": "^4.0.9",
|
||||
"tsx": "^4.19.3",
|
||||
"tailwindcss": "^4.1.11",
|
||||
"tsx": "^4.20.3",
|
||||
"typedoc": "0.28.3",
|
||||
"typedoc-plugin-markdown": "^4.6.2",
|
||||
"typedoc-plugin-merge-modules": " ^7.0.0",
|
||||
"typescript": "^5.7.3"
|
||||
"typescript": "^5.8.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import { MagicMove } from "@/components/magic-move";
|
||||
import { NpmInstall } from "@/components/npm-install";
|
||||
import { Supports } from "@/components/supports";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { DOCUMENT_URL } from "@/lib/const";
|
||||
import { DOCUMENT_URL } from "@/libs/const";
|
||||
import { SiStackblitz } from "@icons-pack/react-simple-icons";
|
||||
import { Blocks, Bot, Footprints, Terminal } from "lucide-react";
|
||||
import Link from "next/link";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { source } from "@/lib/source";
|
||||
import { source } from "@/libs/source";
|
||||
import { structure } from "fumadocs-core/mdx-plugins";
|
||||
import { createFromSource } from "fumadocs-core/search/server";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import * as demos from "@/components/demo/lazy";
|
||||
import { createMetadata, metadataImage } from "@/lib/metadata";
|
||||
import { openapi, source } from "@/lib/source";
|
||||
import { createMetadata, metadataImage } from "@/libs/metadata";
|
||||
import { openapi, source } from "@/libs/source";
|
||||
import * as Icons from "@icons-pack/react-simple-icons";
|
||||
import { APIPage } from "fumadocs-openapi/ui";
|
||||
import { Popup, PopupContent, PopupTrigger } from "fumadocs-twoslash/ui";
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { baseOptions } from "@/app/layout.config";
|
||||
import { source } from "@/lib/source";
|
||||
import { source } from "@/libs/source";
|
||||
import "fumadocs-twoslash/twoslash.css";
|
||||
import { DocsLayout } from "fumadocs-ui/layouts/docs";
|
||||
import type { ReactNode } from "react";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { DOCUMENT_URL } from "@/lib/const";
|
||||
import { DOCUMENT_URL } from "@/libs/const";
|
||||
import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared";
|
||||
import Image from "next/image";
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { AIProvider } from "@/actions";
|
||||
import { TooltipProvider } from "@/components/ui/tooltip";
|
||||
import { GoogleAnalytics } from "@next/third-parties/google";
|
||||
import { RootProvider } from "fumadocs-ui/provider";
|
||||
import { Inter } from "next/font/google";
|
||||
import type { ReactNode } from "react";
|
||||
@@ -31,6 +32,9 @@ export default function Layout({ children }: { children: ReactNode }) {
|
||||
sizes="16x16"
|
||||
href="/favicon-16x16.png"
|
||||
/>
|
||||
<title>
|
||||
LlamaIndex.TS - Build LLM-powered document agents and workflows
|
||||
</title>
|
||||
</head>
|
||||
<body className="flex min-h-screen flex-col">
|
||||
<TooltipProvider>
|
||||
@@ -39,6 +43,7 @@ export default function Layout({ children }: { children: ReactNode }) {
|
||||
</AIProvider>
|
||||
</TooltipProvider>
|
||||
</body>
|
||||
<GoogleAnalytics gaId="G-NB9B8LW9W5" />
|
||||
</html>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { generateOGImage } from "@/app/og/[...slug]/og";
|
||||
import { metadataImage } from "@/lib/metadata";
|
||||
import { metadataImage } from "@/libs/metadata";
|
||||
import { type ImageResponse } from "next/og";
|
||||
import { readFileSync } from "node:fs";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import ContributorCounter from "@/components/contributor-count";
|
||||
import { buttonVariants } from "@/components/ui/button";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
import { Heart } from "lucide-react";
|
||||
import { ReactElement } from "react";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { fetchContributors } from "@/lib/get-contributors";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { fetchContributors } from "@/libs/get-contributors";
|
||||
import { cn } from "@/libs/utils";
|
||||
import Image from "next/image";
|
||||
import type { HTMLAttributes, ReactElement } from "react";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
"use client";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
import { TerminalIcon } from "lucide-react";
|
||||
import {
|
||||
Fragment,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
import { LucideIcon } from "lucide-react";
|
||||
import { HTMLAttributes, ReactElement, ReactNode } from "react";
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
import { CodeBlock } from "fumadocs-ui/components/codeblock";
|
||||
import { RotateCcw } from "lucide-react";
|
||||
import { useTheme } from "next-themes";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
"use client";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
import Image from "next/image";
|
||||
import { ReactNode } from "react";
|
||||
import { IconAI, IconUser } from "./ui/icons";
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
import {
|
||||
AnimatePresence,
|
||||
motion,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { cva, type VariantProps } from "class-variance-authority";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
const alertVariants = cva(
|
||||
"relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { cva, type VariantProps } from "class-variance-authority";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
const badgeVariants = cva(
|
||||
"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
|
||||
|
||||
@@ -2,7 +2,7 @@ import { Slot } from "@radix-ui/react-slot";
|
||||
import { cva, type VariantProps } from "class-variance-authority";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
const buttonVariants = cva(
|
||||
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
||||
|
||||
@@ -4,7 +4,7 @@ import * as DialogPrimitive from "@radix-ui/react-dialog";
|
||||
import { Cross2Icon } from "@radix-ui/react-icons";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
const Dialog = DialogPrimitive.Root;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
export function IconAI({ className, ...props }: React.ComponentProps<"svg">) {
|
||||
return (
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
"use client";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
import { animate, motion, useMotionValue } from "framer-motion";
|
||||
import { useEffect, useState } from "react";
|
||||
import useMeasure from "react-use-measure";
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
export type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import * as LabelPrimitive from "@radix-ui/react-label";
|
||||
import { cva, type VariantProps } from "class-variance-authority";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
const labelVariants = cva(
|
||||
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
function Skeleton({
|
||||
className,
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import * as SliderPrimitive from "@radix-ui/react-slider";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
const Slider = React.forwardRef<
|
||||
React.ElementRef<typeof SliderPrimitive.Root>,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
export type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
|
||||
import * as React from "react";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import { cn } from "@/libs/utils";
|
||||
|
||||
const TooltipProvider = TooltipPrimitive.Provider;
|
||||
|
||||
|
||||
@@ -0,0 +1,182 @@
|
||||
---
|
||||
title: Memory
|
||||
description: Manage conversation history and context with agents
|
||||
---
|
||||
|
||||
## Concept
|
||||
|
||||
Memory is a core component of agentic systems. It allows you to store and retrieve information from the past.
|
||||
|
||||
In LlamaIndexTS, you can create memory by using the `createMemory` function. This function will return a `Memory` object, which you can then use to store and retrieve information.
|
||||
|
||||
As the agent runs, it will make calls to `add()` to store information, and `get()` to retrieve information.
|
||||
|
||||
## Usage
|
||||
|
||||
A `Memory` object has both short-term memory (i.e. a FIFO queue of messages) and optionally long-term memory (i.e. extracting information over time).
|
||||
|
||||
`get()` always returns all messages stored in the memory. The longer the agent runs, this will exceed the context window of the agent. To avoid this, the agent is using the `getLLM` method to get the last X messages that fit into the context window.
|
||||
|
||||
### Configuring Memory for an Agent
|
||||
|
||||
Here we're creating a memory with a static block (read more about [memory blocks](#long-term-memory)) that contains some information about the user.
|
||||
|
||||
```ts twoslash
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { createMemory, staticBlock } from "llamaindex";
|
||||
|
||||
const llm = openai({ model: "gpt-4.1-mini" });
|
||||
|
||||
// Create memory with predefined context
|
||||
const memory = createMemory({
|
||||
memoryBlocks: [
|
||||
staticBlock({
|
||||
content:
|
||||
"The user is a software engineer who loves TypeScript and LlamaIndex.",
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
// Create an agent with the memory
|
||||
const workflow = agent({
|
||||
name: "assistant",
|
||||
llm,
|
||||
memory,
|
||||
});
|
||||
|
||||
const result = await workflow.run("What is my name?");
|
||||
console.log("Response:", result.data.result);
|
||||
```
|
||||
|
||||
### Using Vercel format
|
||||
|
||||
You can also put messages in Vercel format directly to the memory:
|
||||
|
||||
```ts
|
||||
await memory.add({
|
||||
id: "1",
|
||||
createdAt: new Date(),
|
||||
role: "user",
|
||||
content: "Hello!",
|
||||
options: {
|
||||
parts: [
|
||||
{
|
||||
type: "file",
|
||||
data: "base64...",
|
||||
mimeType: "image/png",
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
If you call `get`, messages are usually retrieved in the LlamaIndexTS format (type `ChatMessage`). If you specify the `type` parameter using `get`, you can return the messages in different formats. E.g.: using `type: "vercel"`, you can return the messages in Vercel format:
|
||||
|
||||
```ts
|
||||
const messages = await memory.get({ type: "vercel" });
|
||||
console.log(messages);
|
||||
```
|
||||
|
||||
## Customizing Memory
|
||||
|
||||
### Short-Term Memory
|
||||
|
||||
The `Memory` object will store all the messages that are added to the `Memory` object. Unless you call `clear()`, no messages are removed from the memory. This is the short-term memory (usually you will store the memory of one user session there) which is augmented by the long-term memory.
|
||||
|
||||
Calling `getLLM` will retrieve messages from long-term memory and ensure that the given `tokenLimit` is not reached. These are the messages that you will sent to the LLM.
|
||||
|
||||
For initialization, you call `createMemory` with the following options:
|
||||
|
||||
- `tokenLimit`: Maximum tokens for memory retrieval using `getLLM` (default: 30000).
|
||||
- `shortTermTokenLimitRatio`: Ratio of tokens for short-term vs long-term memory (default: 0.7)
|
||||
- `customAdapters`: Custom message adapters for different message formats. LlamaIndex (`ChatMessageAdapter`) and Vercel (`VercelMessageAdapter`) are built-in adapters.
|
||||
- `memoryBlocks`: Memory blocks for long-term storage, see [Long-Term Memory](#long-term-memory)
|
||||
|
||||
Example:
|
||||
|
||||
```ts
|
||||
const memory = createMemory({
|
||||
tokenLimit=40000,
|
||||
shortTermTokenLimitRatio=0.5,
|
||||
});
|
||||
```
|
||||
|
||||
### Long-Term Memory
|
||||
|
||||
Long-term memory is represented as `Memory Block` objects. These objects contain information that are from previous user sessions or from the beginning of the current conversation. When memory is retrieved (by calling `getLLM`), the short-term and long-term memories are merged together within the given `tokenLimit`.
|
||||
|
||||
Currently, there are two predefined memory blocks:
|
||||
|
||||
- `staticBlock`: A memory block that stores a static piece of information.
|
||||
- `factExtractionBlock`: A memory block that extracts facts from the chat history.
|
||||
|
||||
This sounds a bit complicated, but it's actually quite simple. Let's look at an example:
|
||||
|
||||
```ts
|
||||
import { createMemory, factExtractionBlock, staticBlock } from "llamaindex";
|
||||
|
||||
const memoryBlocks= [
|
||||
staticBlock({
|
||||
id: "core_info",
|
||||
content: "My name is Logan, and I live in Saskatoon. I work at LlamaIndex.",
|
||||
}),
|
||||
factExtractionBlock({
|
||||
id: "user-extracted_info",
|
||||
priority: 1,
|
||||
llm: llm,
|
||||
maxFacts: 50,
|
||||
}),
|
||||
];
|
||||
```
|
||||
|
||||
Here, we've setup two memory blocks:
|
||||
|
||||
- `core_info`: A static memory block that stores some core information about the user. This information will always be inserted into the memory. The type used is `MessageContent` to support multi-modal content.
|
||||
- `extracted_info`: An extracted memory block that will extract information from the chat history. Here we've passed in the `llm` to use to extract facts from the chat history, and set the `maxFacts` to 50. If the number of extracted facts exceeds this limit, the `maxFacts` will be automatically summarized and reduced to leave room for new information.
|
||||
|
||||
You'll also notice that we've set the `priority` for the `factExtractionBlock` block. This is used to determine the handling when the memory blocks content (i.e. long-term memory) + short-term memory exceeds the token limit on the `Memory` object.
|
||||
|
||||
- `priority=0`: This block will always be kept in memory (`staticBlocks` always have priority 0.)
|
||||
- `priority=1, 2, 3, etc`: This determines the order in which memory blocks are truncated when the memory exceeds the token limit, to help the overall short-term memory + long-term memory content be less than or equal to the `tokenLimit`.
|
||||
|
||||
Now, let's pass these blocks into the `createMemory` function:
|
||||
|
||||
```ts
|
||||
const memory = createMemory({
|
||||
tokenLimit: 40000,
|
||||
memoryBlocks: memoryBlocks,
|
||||
)
|
||||
```
|
||||
|
||||
When memory is retrieved (using `getLLM`), the short-term and long-term memories are merged together. The `Memory` object will ensure that the short-term memory + long-term memory content is less than or equal to the `tokenLimit`. If it is longer, messages are retrieved in the following order:
|
||||
|
||||
1. StaticMemoryBlock (information always included)
|
||||
2. LongTermMemoryBlock (depending on priority)
|
||||
3. ShortTermMemoryBlock
|
||||
4. Transient messages
|
||||
|
||||
The amount of short-term memory included is specified by the `shortTermTokenLimitRatio`. If it's set to `0.7`, 70% of the `tokenLimit` is used for short-term memory (not including the static memory block).
|
||||
|
||||
## Persistence with Snapshots
|
||||
|
||||
Save and restore memory state:
|
||||
|
||||
```ts twoslash
|
||||
import { createMemory, loadMemory } from "llamaindex";
|
||||
|
||||
const memory = createMemory();
|
||||
|
||||
// Add some messages
|
||||
await memory.add({ role: "user", content: "Hello!" });
|
||||
|
||||
// Create snapshot
|
||||
const snapshot = memory.snapshot();
|
||||
|
||||
// Later, restore from the snapshot
|
||||
const restoredMemory = loadMemory(snapshot);
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
Want to learn more about the Memory class? Check out our example codes in [Github](https://github.com/run-llama/LlamaIndexTS/tree/main/examples/agents/memory).
|
||||
@@ -1,4 +1,11 @@
|
||||
{
|
||||
"title": "Data",
|
||||
"pages": ["index", "readers", "data_index", "ingestion_pipeline", "stores"]
|
||||
"pages": [
|
||||
"index",
|
||||
"memory",
|
||||
"readers",
|
||||
"data_index",
|
||||
"ingestion_pipeline",
|
||||
"stores"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ A retriever in LlamaIndex is what is used to fetch `Node`s from an index using a
|
||||
- [KeywordTableLLMRetriever](/docs/api/classes/KeywordTableLLMRetriever) uses an LLM to extract keywords from the query and retrieve relevant nodes based on keyword matches.
|
||||
- [KeywordTableSimpleRetriever](/docs/api/classes/KeywordTableSimpleRetriever) uses a basic frequency-based approach to extract keywords and retrieve nodes.
|
||||
- [KeywordTableRAKERetriever](/docs/api/classes/KeywordTableRAKERetriever) uses the RAKE (Rapid Automatic Keyword Extraction) algorithm to extract keywords from the query, focusing on co-occurrence and context for keyword-based retrieval.
|
||||
- [Bm25Retriever](/docs/api/classes/Bm25Retriever) uses the BM25 algorithm to extract keywords from the query and retrieve relevant nodes based on keyword matches.
|
||||
|
||||
```typescript
|
||||
const retriever = vectorIndex.asRetriever({
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
import { createMetadataImage } from 'fumadocs-core/server';
|
||||
import { source } from '@/lib/source';
|
||||
import { Metadata } from 'next';
|
||||
|
||||
export const metadataImage = createMetadataImage({
|
||||
source,
|
||||
imageRoute: 'og',
|
||||
});
|
||||
|
||||
export function createMetadata(override: Metadata): Metadata {
|
||||
return {
|
||||
...override,
|
||||
openGraph: {
|
||||
title: override.title ?? undefined,
|
||||
description: override.description ?? undefined,
|
||||
url: 'https://ts.llamaindex.ai/',
|
||||
images: '/og.png',
|
||||
siteName: 'LlamaIndex.TS',
|
||||
...override.openGraph,
|
||||
},
|
||||
twitter: {
|
||||
card: 'summary_large_image',
|
||||
creator: '@llama_index',
|
||||
title: override.title ?? undefined,
|
||||
description: override.description ?? undefined,
|
||||
images: '/og.png',
|
||||
...override.twitter,
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
import { clsx, type ClassValue } from "clsx"
|
||||
import { twMerge } from "tailwind-merge"
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs))
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
// when we are ready, change to /docs/llamaindex
|
||||
export const DOCUMENT_URL = '/docs/llamaindex'
|
||||
export const DOCUMENT_URL = "/docs/llamaindex";
|
||||
@@ -10,7 +10,7 @@ export async function fetchContributors(
|
||||
): Promise<Contributor[]> {
|
||||
const headers = new Headers();
|
||||
if (process.env.GITHUB_TOKEN)
|
||||
headers.set('Authorization', `Bearer ${process.env.GITHUB_TOKEN}`);
|
||||
headers.set("Authorization", `Bearer ${process.env.GITHUB_TOKEN}`);
|
||||
|
||||
const response = await fetch(
|
||||
`https://api.github.com/repos/${repoOwner}/${repoName}/contributors?per_page=50`,
|
||||
@@ -26,6 +26,6 @@ export async function fetchContributors(
|
||||
|
||||
const contributors = (await response.json()) as Contributor[];
|
||||
return contributors
|
||||
.filter((contributor) => !contributor.login.endsWith('[bot]'))
|
||||
.filter((contributor) => !contributor.login.endsWith("[bot]"))
|
||||
.sort((a, b) => b.contributions - a.contributions);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import { source } from "@/libs/source";
|
||||
import { createMetadataImage } from "fumadocs-core/server";
|
||||
import { Metadata } from "next";
|
||||
|
||||
export const metadataImage = createMetadataImage({
|
||||
source,
|
||||
imageRoute: "og",
|
||||
});
|
||||
|
||||
export function createMetadata(override: Metadata): Metadata {
|
||||
return {
|
||||
...override,
|
||||
openGraph: {
|
||||
title: override.title ?? undefined,
|
||||
description: override.description ?? undefined,
|
||||
url: "https://ts.llamaindex.ai/",
|
||||
images: "/og.png",
|
||||
siteName: "LlamaIndex.TS",
|
||||
...override.openGraph,
|
||||
},
|
||||
twitter: {
|
||||
card: "summary_large_image",
|
||||
creator: "@llama_index",
|
||||
title: override.title ?? undefined,
|
||||
description: override.description ?? undefined,
|
||||
images: "/og.png",
|
||||
...override.twitter,
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
import { docs } from '@/.source';
|
||||
import { loader } from 'fumadocs-core/source';
|
||||
import { docs } from "@/.source";
|
||||
import { loader } from "fumadocs-core/source";
|
||||
import { createOpenAPI } from "fumadocs-openapi/server";
|
||||
|
||||
export const source = loader({
|
||||
baseUrl: '/docs',
|
||||
baseUrl: "/docs",
|
||||
source: docs.toFumadocsSource(),
|
||||
});
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
import { clsx, type ClassValue } from "clsx";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs));
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@cloudflare/workers-types": "^4.20241112.0",
|
||||
"typescript": "^5.7.3",
|
||||
"typescript": "^5.8.3",
|
||||
"wrangler": "^3.89.0"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,5 +1,30 @@
|
||||
# @llamaindex/cloudflare-worker-agent-test
|
||||
|
||||
## 0.0.176
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.15
|
||||
|
||||
## 0.0.175
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.14
|
||||
|
||||
## 0.0.174
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.13
|
||||
|
||||
## 0.0.173
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [515a8b9]
|
||||
- llamaindex@0.11.12
|
||||
|
||||
## 0.0.172
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/cloudflare-worker-agent-test",
|
||||
"version": "0.0.172",
|
||||
"version": "0.0.176",
|
||||
"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.3",
|
||||
"typescript": "^5.8.3",
|
||||
"vitest": "2.1.5",
|
||||
"wrangler": "^3.87.0"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,34 @@
|
||||
# @llamaindex/llama-parse-browser-test
|
||||
|
||||
## 0.0.75
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [48b0d88]
|
||||
- Updated dependencies [f185772]
|
||||
- @llamaindex/cloud@4.0.20
|
||||
|
||||
## 0.0.74
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [5a0ed1f]
|
||||
- Updated dependencies [5a0ed1f]
|
||||
- @llamaindex/cloud@4.0.19
|
||||
|
||||
## 0.0.73
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [47a7555]
|
||||
- @llamaindex/cloud@4.0.18
|
||||
|
||||
## 0.0.72
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- @llamaindex/cloud@4.0.17
|
||||
|
||||
## 0.0.71
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/llama-parse-browser-test",
|
||||
"private": true,
|
||||
"version": "0.0.71",
|
||||
"version": "0.0.75",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
@@ -9,7 +9,7 @@
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"devDependencies": {
|
||||
"typescript": "^5.7.3",
|
||||
"typescript": "^5.8.3",
|
||||
"vite": "^6.3.3",
|
||||
"vite-plugin-wasm": "^3.4.1"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,30 @@
|
||||
# @llamaindex/next-agent-test
|
||||
|
||||
## 0.1.176
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.15
|
||||
|
||||
## 0.1.175
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.14
|
||||
|
||||
## 0.1.174
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.13
|
||||
|
||||
## 0.1.173
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [515a8b9]
|
||||
- llamaindex@0.11.12
|
||||
|
||||
## 0.1.172
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/next-agent-test",
|
||||
"version": "0.1.172",
|
||||
"version": "0.1.176",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
@@ -8,18 +8,18 @@
|
||||
"start": "next start"
|
||||
},
|
||||
"dependencies": {
|
||||
"ai": "^4.0.0",
|
||||
"ai": "^4.3.17",
|
||||
"llamaindex": "workspace:*",
|
||||
"next": "^15.3.0",
|
||||
"next": "^15.3.3",
|
||||
"react": "19.0.0",
|
||||
"react-dom": "19.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.9.0",
|
||||
"@types/react": "^19.0.10",
|
||||
"@types/react-dom": "^19.0.4",
|
||||
"eslint": "9.16.0",
|
||||
"eslint-config-next": "15.1.0",
|
||||
"typescript": "^5.7.3"
|
||||
"@types/node": "^24.0.13",
|
||||
"@types/react": "^19.1.8",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"eslint": "9.30.1",
|
||||
"eslint-config-next": "15.3.5",
|
||||
"typescript": "^5.8.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,30 @@
|
||||
# test-edge-runtime
|
||||
|
||||
## 0.1.175
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.15
|
||||
|
||||
## 0.1.174
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.14
|
||||
|
||||
## 0.1.173
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.13
|
||||
|
||||
## 0.1.172
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [515a8b9]
|
||||
- llamaindex@0.11.12
|
||||
|
||||
## 0.1.171
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/nextjs-edge-runtime-test",
|
||||
"version": "0.1.171",
|
||||
"version": "0.1.175",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
@@ -9,14 +9,14 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"llamaindex": "workspace:*",
|
||||
"next": "^15.3.0",
|
||||
"next": "^15.3.3",
|
||||
"react": "^19.1.0",
|
||||
"react-dom": "^19.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.9.0",
|
||||
"@types/react": "^19.0.10",
|
||||
"@types/react-dom": "^19.0.4",
|
||||
"typescript": "^5.7.3"
|
||||
"@types/node": "^24.0.13",
|
||||
"@types/react": "^19.1.8",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"typescript": "^5.8.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,34 @@
|
||||
# @llamaindex/next-node-runtime
|
||||
|
||||
## 0.1.44
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.15
|
||||
|
||||
## 0.1.43
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.14
|
||||
- @llamaindex/huggingface@0.1.18
|
||||
- @llamaindex/readers@3.1.13
|
||||
|
||||
## 0.1.42
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.13
|
||||
|
||||
## 0.1.41
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [515a8b9]
|
||||
- llamaindex@0.11.12
|
||||
- @llamaindex/huggingface@0.1.17
|
||||
- @llamaindex/readers@3.1.12
|
||||
|
||||
## 0.1.40
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/next-node-runtime-test",
|
||||
"version": "0.1.40",
|
||||
"version": "0.1.44",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
@@ -11,16 +11,16 @@
|
||||
"@llamaindex/huggingface": "workspace:*",
|
||||
"@llamaindex/readers": "workspace:*",
|
||||
"llamaindex": "workspace:*",
|
||||
"next": "^15.3.0",
|
||||
"next": "^15.3.3",
|
||||
"react": "19.0.0",
|
||||
"react-dom": "19.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.9.0",
|
||||
"@types/react": "^19.0.10",
|
||||
"@types/react-dom": "^19.0.4",
|
||||
"eslint": "9.16.0",
|
||||
"eslint-config-next": "15.1.0",
|
||||
"typescript": "^5.7.3"
|
||||
"@types/node": "^24.0.13",
|
||||
"@types/react": "^19.1.8",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"eslint": "9.30.1",
|
||||
"eslint-config-next": "15.3.5",
|
||||
"typescript": "^5.8.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,30 @@
|
||||
# vite-import-llamaindex
|
||||
|
||||
## 0.0.42
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.15
|
||||
|
||||
## 0.0.41
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.14
|
||||
|
||||
## 0.0.40
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.13
|
||||
|
||||
## 0.0.39
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [515a8b9]
|
||||
- llamaindex@0.11.12
|
||||
|
||||
## 0.0.38
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "vite-import-llamaindex",
|
||||
"private": true,
|
||||
"version": "0.0.38",
|
||||
"version": "0.0.42",
|
||||
"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.3",
|
||||
"typescript": "^5.8.3",
|
||||
"vite": "^6.3.3"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
@@ -1,9 +1 @@
|
||||
{
|
||||
"root": [
|
||||
"./src/main.ts",
|
||||
"./vite.config.ts",
|
||||
"./tsconfig.json"
|
||||
],
|
||||
"errors": true,
|
||||
"version": "5.7.3"
|
||||
}
|
||||
{"root":["./src/main.ts","./vite.config.ts"],"version":"5.7.3"}
|
||||
@@ -1,5 +1,30 @@
|
||||
# @llamaindex/waku-query-engine-test
|
||||
|
||||
## 0.0.176
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.15
|
||||
|
||||
## 0.0.175
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.14
|
||||
|
||||
## 0.0.174
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.13
|
||||
|
||||
## 0.0.173
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [515a8b9]
|
||||
- llamaindex@0.11.12
|
||||
|
||||
## 0.0.172
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/waku-query-engine-test",
|
||||
"version": "0.0.172",
|
||||
"version": "0.0.176",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
@@ -18,10 +18,10 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/postcss": "^4.1.4",
|
||||
"@types/react": "19.0.10",
|
||||
"@types/react-dom": "19.0.4",
|
||||
"@types/react": "19.1.8",
|
||||
"@types/react-dom": "19.1.6",
|
||||
"rollup": "4.38.0",
|
||||
"tailwindcss": "^4.1.4",
|
||||
"typescript": "5.7.3"
|
||||
"tailwindcss": "^4.1.11",
|
||||
"typescript": "5.8.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ import { mockLLMEvent } from "./utils.js";
|
||||
let llm: LLM;
|
||||
beforeEach(async () => {
|
||||
Settings.llm = new Anthropic({
|
||||
model: "claude-3-opus",
|
||||
model: "claude-3.5-sonnet",
|
||||
});
|
||||
llm = Settings.llm;
|
||||
});
|
||||
|
||||
+4
-4
@@ -19,14 +19,14 @@
|
||||
"@llamaindex/openai": "workspace:*",
|
||||
"@llamaindex/pinecone": "workspace:*",
|
||||
"@llamaindex/postgres": "workspace:*",
|
||||
"@types/node": "^22.9.0",
|
||||
"@types/node": "^24.0.13",
|
||||
"@types/pg": "^8.11.8",
|
||||
"consola": "^3.2.3",
|
||||
"dotenv": "^16.4.5",
|
||||
"dotenv": "^17.2.0",
|
||||
"llamaindex": "workspace:*",
|
||||
"pg": "^8.12.0",
|
||||
"pgvector": "0.2.0",
|
||||
"tsx": "^4.19.3",
|
||||
"zod": "^3.25.67"
|
||||
"tsx": "^4.20.3",
|
||||
"zod": "^3.25.76"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,127 @@
|
||||
# examples
|
||||
|
||||
## 0.3.28
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 36773a8: Fixed start script, reverted some changes to imports
|
||||
- 891562d: Fix xai dependency in the examples
|
||||
- Updated dependencies [5a0ed1f]
|
||||
- Updated dependencies [5a0ed1f]
|
||||
- Updated dependencies [8eeac33]
|
||||
- @llamaindex/cloud@4.0.19
|
||||
- @llamaindex/core@0.6.14
|
||||
- llamaindex@0.11.14
|
||||
- @llamaindex/node-parser@2.0.14
|
||||
- @llamaindex/anthropic@0.3.16
|
||||
- @llamaindex/assemblyai@0.1.13
|
||||
- @llamaindex/clip@0.0.64
|
||||
- @llamaindex/cohere@0.0.28
|
||||
- @llamaindex/deepinfra@0.0.64
|
||||
- @llamaindex/discord@0.1.13
|
||||
- @llamaindex/google@0.3.13
|
||||
- @llamaindex/huggingface@0.1.18
|
||||
- @llamaindex/jinaai@0.0.24
|
||||
- @llamaindex/mistral@0.1.14
|
||||
- @llamaindex/mixedbread@0.0.28
|
||||
- @llamaindex/notion@0.1.13
|
||||
- @llamaindex/ollama@0.1.14
|
||||
- @llamaindex/openai@0.4.8
|
||||
- @llamaindex/perplexity@0.0.21
|
||||
- @llamaindex/portkey-ai@0.0.56
|
||||
- @llamaindex/replicate@0.0.56
|
||||
- @llamaindex/bm25-retriever@0.0.3
|
||||
- @llamaindex/astra@0.0.28
|
||||
- @llamaindex/azure@0.1.25
|
||||
- @llamaindex/chroma@0.0.28
|
||||
- @llamaindex/elastic-search@0.1.14
|
||||
- @llamaindex/firestore@1.0.21
|
||||
- @llamaindex/milvus@0.1.23
|
||||
- @llamaindex/mongodb@0.0.29
|
||||
- @llamaindex/pinecone@0.1.14
|
||||
- @llamaindex/postgres@0.0.57
|
||||
- @llamaindex/qdrant@0.1.24
|
||||
- @llamaindex/supabase@0.1.14
|
||||
- @llamaindex/upstash@0.0.28
|
||||
- @llamaindex/weaviate@0.0.29
|
||||
- @llamaindex/vercel@0.1.14
|
||||
- @llamaindex/voyage-ai@1.0.20
|
||||
- @llamaindex/readers@3.1.13
|
||||
- @llamaindex/tools@0.1.4
|
||||
- @llamaindex/workflow@1.1.14
|
||||
- @llamaindex/deepseek@0.0.24
|
||||
- @llamaindex/fireworks@0.0.24
|
||||
- @llamaindex/groq@0.0.80
|
||||
- @llamaindex/together@0.0.24
|
||||
- @llamaindex/vllm@0.0.50
|
||||
- @llamaindex/xai@0.0.11
|
||||
|
||||
## 0.3.27
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [229cdeb]
|
||||
- Updated dependencies [47a7555]
|
||||
- @llamaindex/groq@0.0.79
|
||||
- @llamaindex/cloud@4.0.18
|
||||
- llamaindex@0.11.13
|
||||
|
||||
## 0.3.26
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [d578889]
|
||||
- Updated dependencies [0fcc92f]
|
||||
- Updated dependencies [515a8b9]
|
||||
- Updated dependencies [3cd8a57]
|
||||
- Updated dependencies [f2dfd30]
|
||||
- @llamaindex/core@0.6.13
|
||||
- llamaindex@0.11.12
|
||||
- @llamaindex/tools@0.1.3
|
||||
- @llamaindex/bm25-retriever@0.0.2
|
||||
- @llamaindex/cloud@4.0.17
|
||||
- @llamaindex/node-parser@2.0.13
|
||||
- @llamaindex/anthropic@0.3.15
|
||||
- @llamaindex/assemblyai@0.1.12
|
||||
- @llamaindex/clip@0.0.63
|
||||
- @llamaindex/cohere@0.0.27
|
||||
- @llamaindex/deepinfra@0.0.63
|
||||
- @llamaindex/discord@0.1.12
|
||||
- @llamaindex/google@0.3.12
|
||||
- @llamaindex/huggingface@0.1.17
|
||||
- @llamaindex/jinaai@0.0.23
|
||||
- @llamaindex/mistral@0.1.13
|
||||
- @llamaindex/mixedbread@0.0.27
|
||||
- @llamaindex/notion@0.1.12
|
||||
- @llamaindex/ollama@0.1.13
|
||||
- @llamaindex/openai@0.4.7
|
||||
- @llamaindex/perplexity@0.0.20
|
||||
- @llamaindex/portkey-ai@0.0.55
|
||||
- @llamaindex/replicate@0.0.55
|
||||
- @llamaindex/astra@0.0.27
|
||||
- @llamaindex/azure@0.1.24
|
||||
- @llamaindex/chroma@0.0.27
|
||||
- @llamaindex/elastic-search@0.1.13
|
||||
- @llamaindex/firestore@1.0.20
|
||||
- @llamaindex/milvus@0.1.22
|
||||
- @llamaindex/mongodb@0.0.28
|
||||
- @llamaindex/pinecone@0.1.13
|
||||
- @llamaindex/postgres@0.0.56
|
||||
- @llamaindex/qdrant@0.1.23
|
||||
- @llamaindex/supabase@0.1.13
|
||||
- @llamaindex/upstash@0.0.27
|
||||
- @llamaindex/weaviate@0.0.28
|
||||
- @llamaindex/vercel@0.1.13
|
||||
- @llamaindex/voyage-ai@1.0.19
|
||||
- @llamaindex/readers@3.1.12
|
||||
- @llamaindex/workflow@1.1.13
|
||||
- @llamaindex/deepseek@0.0.23
|
||||
- @llamaindex/fireworks@0.0.23
|
||||
- @llamaindex/groq@0.0.78
|
||||
- @llamaindex/together@0.0.23
|
||||
- @llamaindex/vllm@0.0.49
|
||||
- @llamaindex/xai@0.0.10
|
||||
|
||||
## 0.3.25
|
||||
|
||||
### Patch Changes
|
||||
|
||||
+31
-7
@@ -1,9 +1,10 @@
|
||||
# LlamaIndexTS Examples
|
||||
|
||||
Before running any of the code examples,
|
||||
make sure you have basic knowledge of the [LlamaIndexTS](https://ts.llamaindex.ai/).
|
||||
This package contains several examples of how to use LlamaIndexTS.
|
||||
|
||||
## Usage
|
||||
Most examples will use OpenAI by default, so be sure to set your API key.
|
||||
|
||||
## Running Examples
|
||||
|
||||
```shell
|
||||
# export your API key
|
||||
@@ -12,8 +13,31 @@ export OPENAI_API_KEY="sk-..."
|
||||
npx tsx ./rag/chatEngine.ts
|
||||
```
|
||||
|
||||
## Build your own RAG app
|
||||
## Recommended Starter Examples
|
||||
|
||||
```shell
|
||||
npx create llama
|
||||
```
|
||||
Agents:
|
||||
|
||||
- [Basic OpenAI Agent with Tools](./agents/agent/openai.ts)
|
||||
- [Agent with MCP Tools](./agents/agent/mcp-tools.ts)
|
||||
- [Customizing Memory](./agents/memory/agent-memory.ts)
|
||||
|
||||
Workflows:
|
||||
|
||||
- [Workflow basics](./agents/workflow/joke.ts)
|
||||
- [Find more workflow examples in the `workflows-ts` repo!](https://github.com/run-llama/workflows-ts)
|
||||
|
||||
Indexing, Retrieval, and Querying:
|
||||
|
||||
- [Basic Vector Indexing + Query Engine](./index/vectorIndex.ts)
|
||||
- [Agent + Query Engine Tool](./agents/agent/query-tool.ts)
|
||||
|
||||
Multimodal:
|
||||
|
||||
- [Multimodal RAG](./multimodal/rag.ts)
|
||||
- [Multimodal Chat](./multimodal/context.ts)
|
||||
|
||||
Some more general folders that might be useful to explore:
|
||||
|
||||
- [storage](./storage/): Examples with various vector stores
|
||||
- [readers](./readers/): Examples of how to use the various readers
|
||||
- [models](./models/): Examples of how to use the various LLMs and embedding models from many providers
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { agent } from "@llamaindex/workflow";
|
||||
import { createMemory, staticBlock } from "llamaindex";
|
||||
|
||||
// Simple example: Agent with Predefined Memory
|
||||
async function simpleAgentMemoryExample() {
|
||||
console.log("=== Simple Agent Memory Example ===");
|
||||
|
||||
const memory = createMemory({
|
||||
memoryBlocks: [
|
||||
staticBlock({
|
||||
content:
|
||||
"The user is a software engineer who loves TypeScript and LlamaIndex.",
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
// Create agent workflow
|
||||
const workflow = agent({
|
||||
name: "assistant",
|
||||
llm: openai({ model: "gpt-4.1-nano" }),
|
||||
memory,
|
||||
});
|
||||
|
||||
// Test - agent should remember John and the shopping cart context
|
||||
console.log("\n--- Testing Memory Context ---");
|
||||
const result = await workflow.run("Hi, my name is John. Do you know me?");
|
||||
|
||||
console.log("Assistant Response:", result.data.result);
|
||||
|
||||
const result2 = await workflow.run("What is my name?");
|
||||
console.log("Assistant Response:", result2.data.result);
|
||||
}
|
||||
|
||||
// Run the example
|
||||
simpleAgentMemoryExample().catch(console.error);
|
||||
@@ -0,0 +1,58 @@
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { createMemory } from "llamaindex";
|
||||
|
||||
// Example: Basic Memory Usage with Factory
|
||||
async function basicMemoryExample() {
|
||||
console.log("\n=== Example: Basic Memory Usage with Factory ===");
|
||||
|
||||
const memory = createMemory({ tokenLimit: 30 });
|
||||
|
||||
// Add messages to memory
|
||||
await memory.add({
|
||||
role: "user",
|
||||
content: "Hi, my name is John and I'm a software engineer.",
|
||||
});
|
||||
|
||||
await memory.add({
|
||||
role: "assistant",
|
||||
content: "Hello John! Nice to meet you. How can I help you today?",
|
||||
});
|
||||
|
||||
await memory.add({
|
||||
role: "user",
|
||||
content: "I love working with TypeScript and React.",
|
||||
});
|
||||
// Not all messages are included because of token limit is set to 30
|
||||
const llmMessages = await memory.getLLM();
|
||||
console.log(
|
||||
`\nLLM messages (${llmMessages.length} messages) limited by a small token limit:`,
|
||||
);
|
||||
llmMessages.forEach((msg, idx) => {
|
||||
console.log(`${idx + 1}. ${msg.role}: ${msg.content}`);
|
||||
});
|
||||
|
||||
// But the token limit above will be the window size of an LLM instance if you use getLLM with LLM
|
||||
const llm = openai({ model: "gpt-4.1-mini" });
|
||||
const llmMessagesWithLLM = await memory.getLLM(llm);
|
||||
// Now all the messages are included because of the LLM window size of the model is much larger
|
||||
console.log(
|
||||
`\nLLM messages with LLM (${llmMessagesWithLLM.length} messages) limited by LLM window size:`,
|
||||
);
|
||||
llmMessagesWithLLM.forEach((msg, idx) => {
|
||||
console.log(`${idx + 1}. ${msg.role}: ${msg.content}`);
|
||||
});
|
||||
}
|
||||
|
||||
// Main function
|
||||
async function main() {
|
||||
console.log("🧠 Basic Memory Factory Examples");
|
||||
console.log("===============================");
|
||||
|
||||
try {
|
||||
await basicMemoryExample();
|
||||
} catch (error) {
|
||||
console.error("Error running basic memory examples:", error);
|
||||
}
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
@@ -0,0 +1,101 @@
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { createMemory, factExtractionBlock } from "llamaindex";
|
||||
|
||||
// Configure OpenAI
|
||||
const llm = openai({ model: "gpt-4.1-mini" });
|
||||
|
||||
// Example: Memory with Fact Extraction
|
||||
async function factExtractionMemoryExample() {
|
||||
console.log("\n=== Memory with Fact Extraction ===");
|
||||
|
||||
// Create memory with a fact extraction
|
||||
const memory = createMemory([], {
|
||||
tokenLimit: 100,
|
||||
shortTermTokenLimitRatio: 0.7, // 70% for short-term, 30% for long-term
|
||||
memoryBlocks: [
|
||||
factExtractionBlock({
|
||||
id: "user-facts",
|
||||
priority: 5,
|
||||
llm: llm,
|
||||
maxFacts: 10,
|
||||
isLongTerm: true,
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
// Simulate a conversation with facts
|
||||
const conversationTurns = [
|
||||
{
|
||||
role: "user",
|
||||
content: "Hi, I'm Sarah and I work as a data scientist at Google.",
|
||||
},
|
||||
{
|
||||
role: "assistant",
|
||||
content:
|
||||
"Hello Sarah! It's great to meet you. Data science at Google must be exciting!",
|
||||
},
|
||||
{
|
||||
role: "user",
|
||||
content:
|
||||
"Yes, I specialize in machine learning and natural language processing.",
|
||||
},
|
||||
{
|
||||
role: "assistant",
|
||||
content: "That's impressive! ML and NLP are fascinating fields.",
|
||||
},
|
||||
{
|
||||
role: "user",
|
||||
content:
|
||||
"I have a PhD in Computer Science from Stanford, and I love hiking on weekends.",
|
||||
},
|
||||
{
|
||||
role: "assistant",
|
||||
content:
|
||||
"Wow, Stanford PhD! And hiking is a great way to unwind from tech work.",
|
||||
},
|
||||
{
|
||||
role: "user",
|
||||
content: "I also have two cats named Whiskers and Mittens.",
|
||||
},
|
||||
{
|
||||
role: "assistant",
|
||||
content:
|
||||
"Cats make wonderful companions! Whiskers and Mittens are cute names.",
|
||||
},
|
||||
];
|
||||
|
||||
// Add conversation turns to memory
|
||||
console.log("Adding conversation to memory...");
|
||||
for (const turn of conversationTurns) {
|
||||
await memory.add(turn);
|
||||
}
|
||||
|
||||
// Get messages - facts should be extracted and included
|
||||
const messages = await memory.getLLM(llm);
|
||||
console.log("\nMessages with extracted facts:");
|
||||
messages.forEach((msg, idx) => {
|
||||
console.log(`${idx + 1}. ${msg.role ?? "unknown"}: ${msg.content}`);
|
||||
});
|
||||
//Messages with extracted facts:
|
||||
// 1. assistant: Cats make wonderful companions! Whiskers and Mittens are cute names.
|
||||
// 2. user: I also have two cats named Whiskers and Mittens.
|
||||
// 3. assistant: Wow, Stanford PhD! And hiking is a great way to unwind from tech work.
|
||||
// 4. memory: Sarah works as a data scientist at Google
|
||||
// Sarah specializes in machine learning and natural language processing
|
||||
// Sarah has a PhD in Computer Science from Stanford
|
||||
// Sarah enjoys hiking on weekends
|
||||
}
|
||||
|
||||
// Main function
|
||||
async function main() {
|
||||
console.log("🧠 Fact Extraction Memory Example");
|
||||
console.log("=================================");
|
||||
|
||||
try {
|
||||
await factExtractionMemoryExample();
|
||||
} catch (error) {
|
||||
console.error("Error running fact extraction memory example:", error);
|
||||
}
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
@@ -0,0 +1,62 @@
|
||||
import { openai } from "@llamaindex/openai";
|
||||
import { createMemory, staticBlock } from "llamaindex";
|
||||
|
||||
// Configure OpenAI
|
||||
const llm = openai({ model: "gpt-4.1-mini" });
|
||||
|
||||
// Example: Memory with Static Blocks
|
||||
async function staticMemoryBlockExample() {
|
||||
console.log("\n=== Memory with Static Blocks ===");
|
||||
console.log("- Memory always include static block");
|
||||
console.log("- Memory cut off the messages within token limit\n");
|
||||
|
||||
// Create memory with a static block
|
||||
const memory = createMemory([], {
|
||||
tokenLimit: 30, // A small token limit which is not enough for the whole conversation below
|
||||
memoryBlocks: [
|
||||
staticBlock({
|
||||
content:
|
||||
"The user's name is John and he is a software engineer who loves TypeScript and LlamaIndex.",
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
// Add some messages to the memory
|
||||
await memory.add({
|
||||
role: "user",
|
||||
content: "What do you know about me?",
|
||||
});
|
||||
|
||||
await memory.add({
|
||||
role: "assistant",
|
||||
content:
|
||||
"Based on our conversation, I know you're John, a software engineer who enjoys working with TypeScript and LlamaIndex!",
|
||||
});
|
||||
|
||||
await memory.add({
|
||||
role: "user",
|
||||
content: "Which language does LlamaIndex support?",
|
||||
});
|
||||
|
||||
// Get messages
|
||||
// static block will always be included
|
||||
// only the last message will be included because of token limit set above
|
||||
const messages = await memory.getLLM(llm);
|
||||
messages.forEach((msg, idx) => {
|
||||
console.log(`${idx + 1}. ${msg.role}: ${msg.content}`);
|
||||
});
|
||||
// Messages with static block:
|
||||
// 1. user: The user's name is John and he is a software engineer who loves TypeScript and LlamaIndex.
|
||||
// 2. user: Which language does LlamaIndex support?
|
||||
}
|
||||
|
||||
// Main function
|
||||
async function main() {
|
||||
try {
|
||||
await staticMemoryBlockExample();
|
||||
} catch (error) {
|
||||
console.error("Error running static memory blocks example:", error);
|
||||
}
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
@@ -59,7 +59,7 @@ async function main() {
|
||||
|
||||
const anthropic = new Anthropic({
|
||||
apiKey: process.env.ANTHROPIC_API_KEY,
|
||||
model: "claude-3-opus",
|
||||
model: "claude-3.5-sonnet",
|
||||
});
|
||||
|
||||
// Create an ReActAgent with the function tools
|
||||
|
||||
@@ -61,7 +61,7 @@ async function main() {
|
||||
// Create an OpenAIAgent with the function tools
|
||||
const agent = new ReActAgent({
|
||||
llm: new Anthropic({
|
||||
model: "claude-3-opus",
|
||||
model: "claude-3.5-sonnet",
|
||||
}),
|
||||
tools: [functionTool, functionTool2],
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Anthropic } from "@llamaindex/anthropic";
|
||||
import { ChatMemoryBuffer, SimpleChatEngine } from "llamaindex";
|
||||
import { createMemory, SimpleChatEngine } from "llamaindex";
|
||||
import { stdin as input, stdout as output } from "node:process";
|
||||
import readline from "node:readline/promises";
|
||||
|
||||
@@ -9,14 +9,12 @@ import readline from "node:readline/promises";
|
||||
model: "claude-3-7-sonnet",
|
||||
});
|
||||
// chatHistory will store all the messages in the conversation
|
||||
const chatHistory = new ChatMemoryBuffer({
|
||||
chatHistory: [
|
||||
{
|
||||
content: "You want to talk in rhymes.",
|
||||
role: "system",
|
||||
},
|
||||
],
|
||||
});
|
||||
const chatHistory = createMemory([
|
||||
{
|
||||
content: "You want to talk in rhymes.",
|
||||
role: "system",
|
||||
},
|
||||
]);
|
||||
const chatEngine = new SimpleChatEngine({
|
||||
llm,
|
||||
memory: chatHistory,
|
||||
|
||||
@@ -15,15 +15,15 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.25.0",
|
||||
"@types/react": "^19.1.2",
|
||||
"@types/react-dom": "^19.1.2",
|
||||
"@types/react": "^19.1.8",
|
||||
"@types/react-dom": "^19.1.6",
|
||||
"@vitejs/plugin-react": "^4.5.2",
|
||||
"eslint": "^9.25.0",
|
||||
"eslint": "^9.30.1",
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"eslint-plugin-react-refresh": "^0.4.19",
|
||||
"globals": "^16.0.0",
|
||||
"typescript": "~5.8.3",
|
||||
"typescript-eslint": "^8.30.1",
|
||||
"typescript-eslint": "^8.36.0",
|
||||
"vite": "^6.3.5"
|
||||
}
|
||||
}
|
||||
|
||||
+55
-54
@@ -1,79 +1,80 @@
|
||||
{
|
||||
"name": "@llamaindex/examples",
|
||||
"version": "0.3.25",
|
||||
"version": "0.3.28",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"lint": "eslint .",
|
||||
"start": "tsx ./starter.ts"
|
||||
"start": "echo 'To get started, run `npx tsx <path to example>`'"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ai-sdk/openai": "^1.0.5",
|
||||
"@azure/cosmos": "^4.1.1",
|
||||
"@azure/identity": "^4.4.1",
|
||||
"@azure/search-documents": "^12.1.0",
|
||||
"@llamaindex/anthropic": "^0.3.14",
|
||||
"@llamaindex/assemblyai": "^0.1.11",
|
||||
"@llamaindex/astra": "^0.0.26",
|
||||
"@llamaindex/azure": "^0.1.23",
|
||||
"@llamaindex/chroma": "^0.0.26",
|
||||
"@llamaindex/clip": "^0.0.62",
|
||||
"@llamaindex/cloud": "^4.0.16",
|
||||
"@llamaindex/cohere": "^0.0.26",
|
||||
"@llamaindex/core": "^0.6.12",
|
||||
"@llamaindex/deepinfra": "^0.0.62",
|
||||
"@llamaindex/deepseek": "^0.0.22",
|
||||
"@llamaindex/discord": "^0.1.11",
|
||||
"@llamaindex/elastic-search": "^0.1.12",
|
||||
"@llamaindex/anthropic": "^0.3.16",
|
||||
"@llamaindex/assemblyai": "^0.1.13",
|
||||
"@llamaindex/astra": "^0.0.28",
|
||||
"@llamaindex/azure": "^0.1.25",
|
||||
"@llamaindex/bm25-retriever": "^0.0.3",
|
||||
"@llamaindex/chroma": "^0.0.28",
|
||||
"@llamaindex/clip": "^0.0.64",
|
||||
"@llamaindex/cloud": "^4.0.19",
|
||||
"@llamaindex/cohere": "^0.0.28",
|
||||
"@llamaindex/core": "^0.6.14",
|
||||
"@llamaindex/deepinfra": "^0.0.64",
|
||||
"@llamaindex/deepseek": "^0.0.24",
|
||||
"@llamaindex/discord": "^0.1.13",
|
||||
"@llamaindex/elastic-search": "^0.1.14",
|
||||
"@llamaindex/env": "^0.1.30",
|
||||
"@llamaindex/firestore": "^1.0.19",
|
||||
"@llamaindex/fireworks": "^0.0.22",
|
||||
"@llamaindex/google": "^0.3.11",
|
||||
"@llamaindex/groq": "^0.0.77",
|
||||
"@llamaindex/huggingface": "^0.1.16",
|
||||
"@llamaindex/jinaai": "^0.0.22",
|
||||
"@llamaindex/milvus": "^0.1.21",
|
||||
"@llamaindex/mistral": "^0.1.12",
|
||||
"@llamaindex/mixedbread": "^0.0.26",
|
||||
"@llamaindex/mongodb": "^0.0.27",
|
||||
"@llamaindex/node-parser": "^2.0.12",
|
||||
"@llamaindex/notion": "^0.1.11",
|
||||
"@llamaindex/ollama": "^0.1.12",
|
||||
"@llamaindex/openai": "^0.4.6",
|
||||
"@llamaindex/perplexity": "^0.0.19",
|
||||
"@llamaindex/pinecone": "^0.1.12",
|
||||
"@llamaindex/portkey-ai": "^0.0.54",
|
||||
"@llamaindex/postgres": "^0.0.55",
|
||||
"@llamaindex/qdrant": "^0.1.22",
|
||||
"@llamaindex/readers": "^3.1.11",
|
||||
"@llamaindex/replicate": "^0.0.54",
|
||||
"@llamaindex/supabase": "^0.1.12",
|
||||
"@llamaindex/together": "^0.0.22",
|
||||
"@llamaindex/tools": "^0.1.1",
|
||||
"@llamaindex/upstash": "^0.0.26",
|
||||
"@llamaindex/vercel": "^0.1.12",
|
||||
"@llamaindex/vllm": "^0.0.48",
|
||||
"@llamaindex/voyage-ai": "^1.0.18",
|
||||
"@llamaindex/weaviate": "^0.0.27",
|
||||
"@llamaindex/workflow": "^1.1.12",
|
||||
"@llamaindex/xai": "workspace:^0.0.9",
|
||||
"@notionhq/client": "^2.2.15",
|
||||
"@llamaindex/firestore": "^1.0.21",
|
||||
"@llamaindex/fireworks": "^0.0.24",
|
||||
"@llamaindex/google": "^0.3.13",
|
||||
"@llamaindex/groq": "^0.0.80",
|
||||
"@llamaindex/huggingface": "^0.1.18",
|
||||
"@llamaindex/jinaai": "^0.0.24",
|
||||
"@llamaindex/milvus": "^0.1.23",
|
||||
"@llamaindex/mistral": "^0.1.14",
|
||||
"@llamaindex/mixedbread": "^0.0.28",
|
||||
"@llamaindex/mongodb": "^0.0.29",
|
||||
"@llamaindex/node-parser": "^2.0.14",
|
||||
"@llamaindex/notion": "^0.1.13",
|
||||
"@llamaindex/ollama": "^0.1.14",
|
||||
"@llamaindex/openai": "^0.4.8",
|
||||
"@llamaindex/perplexity": "^0.0.21",
|
||||
"@llamaindex/pinecone": "^0.1.14",
|
||||
"@llamaindex/portkey-ai": "^0.0.56",
|
||||
"@llamaindex/postgres": "^0.0.57",
|
||||
"@llamaindex/qdrant": "^0.1.24",
|
||||
"@llamaindex/readers": "^3.1.13",
|
||||
"@llamaindex/replicate": "^0.0.56",
|
||||
"@llamaindex/supabase": "^0.1.14",
|
||||
"@llamaindex/together": "^0.0.24",
|
||||
"@llamaindex/tools": "^0.1.4",
|
||||
"@llamaindex/upstash": "^0.0.28",
|
||||
"@llamaindex/vercel": "^0.1.14",
|
||||
"@llamaindex/vllm": "^0.0.50",
|
||||
"@llamaindex/voyage-ai": "^1.0.20",
|
||||
"@llamaindex/weaviate": "^0.0.29",
|
||||
"@llamaindex/workflow": "^1.1.14",
|
||||
"@llamaindex/xai": "^0.0.11",
|
||||
"@notionhq/client": "^4.0.0",
|
||||
"@pinecone-database/pinecone": "^4.0.0",
|
||||
"@vercel/postgres": "^0.10.0",
|
||||
"ai": "^4.0.0",
|
||||
"ai": "^4.3.17",
|
||||
"ajv": "^8.17.1",
|
||||
"commander": "^12.1.0",
|
||||
"dotenv": "^16.4.5",
|
||||
"dotenv": "^17.2.0",
|
||||
"js-tiktoken": "^1.0.14",
|
||||
"llamaindex": "^0.11.11",
|
||||
"llamaindex": "^0.11.14",
|
||||
"mongodb": "6.7.0",
|
||||
"postgres": "^3.4.4",
|
||||
"wikipedia": "^2.1.2",
|
||||
"zod": "^3.25.67"
|
||||
"zod": "^3.25.76"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.9.0",
|
||||
"tsx": "^4.19.3",
|
||||
"typescript": "^5.7.3"
|
||||
"@types/node": "^24.0.13",
|
||||
"tsx": "^4.20.3",
|
||||
"typescript": "^5.8.3"
|
||||
},
|
||||
"stackblitz": {
|
||||
"startCommand": "npm start"
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
packages:
|
||||
- "**"
|
||||
@@ -2,11 +2,7 @@ import { stdin as input, stdout as output } from "node:process";
|
||||
import readline from "node:readline/promises";
|
||||
|
||||
import { OpenAI } from "@llamaindex/openai";
|
||||
import {
|
||||
ChatSummaryMemoryBuffer,
|
||||
Settings,
|
||||
SimpleChatEngine,
|
||||
} from "llamaindex";
|
||||
import { createMemory, Settings, SimpleChatEngine } from "llamaindex";
|
||||
|
||||
if (process.env.NODE_ENV === "development") {
|
||||
Settings.callbackManager.on("llm-end", (event) => {
|
||||
@@ -15,10 +11,13 @@ if (process.env.NODE_ENV === "development") {
|
||||
}
|
||||
|
||||
async function main() {
|
||||
// Set maxTokens to 75% of the context window size of 4096
|
||||
// This will trigger the summarizer once the chat history reaches 25% of the context window size (1024 tokens)
|
||||
const llm = new OpenAI({ model: "gpt-3.5-turbo", maxTokens: 4096 * 0.75 });
|
||||
const chatHistory = new ChatSummaryMemoryBuffer({ llm });
|
||||
const llm = new OpenAI({ model: "gpt-3.5-turbo" });
|
||||
const chatHistory = createMemory([
|
||||
{
|
||||
content: "You are a helpful assistant.",
|
||||
role: "system",
|
||||
},
|
||||
]);
|
||||
const chatEngine = new SimpleChatEngine({ llm });
|
||||
const rl = readline.createInterface({ input, output });
|
||||
|
||||
@@ -29,10 +28,6 @@ async function main() {
|
||||
chatHistory,
|
||||
stream: true,
|
||||
});
|
||||
if (chatHistory.getLastSummary()) {
|
||||
// Print the summary of the conversation so far that is produced by the SummaryChatHistory
|
||||
console.log(`Summary: ${chatHistory.getLastSummary()?.content}`);
|
||||
}
|
||||
for await (const chunk of stream) {
|
||||
process.stdout.write(chunk.response);
|
||||
}
|
||||
|
||||
@@ -21,13 +21,14 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@llamaindex/cloud": "workspace:* || ^2.0.24",
|
||||
"@llamaindex/readers": "workspace:* || ^1.0.25",
|
||||
"@llamaindex/excel": "workspace:*",
|
||||
"@llamaindex/readers": "workspace:* || ^1.0.25",
|
||||
"@notionhq/client": "^4.0.0",
|
||||
"llamaindex": "workspace:* || ^0.8.37"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^22.9.0",
|
||||
"tsx": "^4.19.3",
|
||||
"typescript": "^5.7.3"
|
||||
"@types/node": "^24.0.13",
|
||||
"tsx": "^4.20.3",
|
||||
"typescript": "^5.8.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { LlamaParseReader } from "@llamaindex/cloud";
|
||||
import { LlamaParseReader } from "@llamaindex/cloud/reader";
|
||||
import { openai, OpenAIEmbedding } from "@llamaindex/openai";
|
||||
import { Settings, VectorStoreIndex } from "llamaindex";
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { LlamaParseReader } from "@llamaindex/cloud";
|
||||
import { LlamaParseReader } from "@llamaindex/cloud/reader";
|
||||
import { SimpleDirectoryReader } from "@llamaindex/readers/directory";
|
||||
import { VectorStoreIndex } from "llamaindex";
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
# BM25 Retriever
|
||||
|
||||
In this guide, we introduce a bm25 retriever that search documents using the bm25 method. BM25 (Best Matching 25) is a ranking function that extends TF-IDF by considering term frequency saturation and document length. BM25 effectively ranks documents based on query term occurrence and rarity across the corpus.
|
||||
|
||||
## Setup
|
||||
|
||||
1. `cd` Into the `examples` directory
|
||||
2. run `npm i`
|
||||
|
||||
## Example
|
||||
|
||||
```bash
|
||||
`npx tsx ./retrievers/bm25/example.ts`
|
||||
```
|
||||
@@ -0,0 +1,33 @@
|
||||
import { Bm25Retriever } from "@llamaindex/bm25-retriever";
|
||||
import { OpenAIEmbedding } from "@llamaindex/openai";
|
||||
import { PDFReader } from "@llamaindex/readers/pdf";
|
||||
import { MetadataMode, Settings, VectorStoreIndex } from "llamaindex";
|
||||
|
||||
Settings.embedModel = new OpenAIEmbedding();
|
||||
|
||||
async function main() {
|
||||
// Load PDF
|
||||
const reader = new PDFReader();
|
||||
const documents = await reader.loadData("./data/brk-2022.pdf");
|
||||
|
||||
// Split text and create embeddings. Store them in a VectorStoreIndex
|
||||
const index = await VectorStoreIndex.fromDocuments(documents);
|
||||
|
||||
const retriever = new Bm25Retriever({
|
||||
docStore: index.docStore,
|
||||
topK: 3,
|
||||
});
|
||||
|
||||
// Query the data
|
||||
const response = await retriever.retrieve({
|
||||
query: "What mistakes did Warren E. Buffett make?",
|
||||
});
|
||||
|
||||
// Output response
|
||||
response.forEach((r) => {
|
||||
console.log(`Score: ${r.score}`);
|
||||
console.log(`Text: ${r.node.getContent(MetadataMode.NONE)}`);
|
||||
});
|
||||
}
|
||||
|
||||
main().catch(console.error);
|
||||
Generated
+10114
File diff suppressed because it is too large
Load Diff
+9
-9
@@ -4,7 +4,7 @@
|
||||
"scripts": {
|
||||
"clean": "find . -type d \\( -name .turbo -o -name node_modules -o -name dist -o -name .next -o -name lib \\) -exec rm -rf {} +",
|
||||
"build": "turbo run build --filter=\"./packages/*\" --filter=\"./packages/providers/**\"",
|
||||
"dev": "turbo run dev --filter=\"./packages/*\" --filter=\"./packages/providers/**\"",
|
||||
"dev": "turbo run dev --filter=\"./packages/*\" --filter=\"./packages/providers/**\" --concurrency=100",
|
||||
"format": "prettier --ignore-unknown --cache --check .",
|
||||
"format:write": "prettier --ignore-unknown --write .",
|
||||
"lint": "turbo run lint",
|
||||
@@ -23,12 +23,12 @@
|
||||
"@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",
|
||||
"eslint": "9.30.1",
|
||||
"eslint-config-next": "^15.3.5",
|
||||
"eslint-config-prettier": "^10.1.5",
|
||||
"eslint-config-turbo": "^2.5.4",
|
||||
"eslint-plugin-react": "7.37.5",
|
||||
"eslint-plugin-turbo": "^2.5.4",
|
||||
"globals": "^15.12.0",
|
||||
"husky": "^9.1.7",
|
||||
"lint-staged": "^15.2.11",
|
||||
@@ -37,8 +37,8 @@
|
||||
"prettier-plugin-organize-imports": "^4.1.0",
|
||||
"prettier-plugin-tailwindcss": "^0.6.11",
|
||||
"turbo": "^2.4.4",
|
||||
"typescript": "^5.7.3",
|
||||
"typescript-eslint": "^8.18.0",
|
||||
"typescript": "^5.8.3",
|
||||
"typescript-eslint": "^8.36.0",
|
||||
"vitest": "^3.1.1"
|
||||
},
|
||||
"packageManager": "pnpm@10.8.1",
|
||||
|
||||
@@ -1,5 +1,30 @@
|
||||
# @llamaindex/autotool
|
||||
|
||||
## 8.0.15
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.15
|
||||
|
||||
## 8.0.14
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.14
|
||||
|
||||
## 8.0.13
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.13
|
||||
|
||||
## 8.0.12
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [515a8b9]
|
||||
- llamaindex@0.11.12
|
||||
|
||||
## 8.0.11
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,5 +1,34 @@
|
||||
# @llamaindex/autotool-01-node-example
|
||||
|
||||
## 0.0.123
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.15
|
||||
- @llamaindex/autotool@8.0.15
|
||||
|
||||
## 0.0.122
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.14
|
||||
- @llamaindex/autotool@8.0.14
|
||||
|
||||
## 0.0.121
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- llamaindex@0.11.13
|
||||
- @llamaindex/autotool@8.0.13
|
||||
|
||||
## 0.0.120
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [515a8b9]
|
||||
- llamaindex@0.11.12
|
||||
- @llamaindex/autotool@8.0.12
|
||||
|
||||
## 0.0.119
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
"openai": "^4.73.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tsx": "^4.19.3"
|
||||
"tsx": "^4.20.3"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
|
||||
},
|
||||
"version": "0.0.119"
|
||||
"version": "0.0.123"
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"url": "git+https://github.com/run-llama/LlamaIndexTS.git",
|
||||
"directory": "packages/autotool"
|
||||
},
|
||||
"version": "8.0.11",
|
||||
"version": "8.0.15",
|
||||
"description": "auto transpile your JS function to LLM Agent compatible",
|
||||
"files": [
|
||||
"dist",
|
||||
@@ -74,12 +74,12 @@
|
||||
"devDependencies": {
|
||||
"@swc/types": "^0.1.12",
|
||||
"@types/json-schema": "^7.0.15",
|
||||
"@types/node": "^22.9.0",
|
||||
"@types/node": "^24.0.13",
|
||||
"llamaindex": "workspace:*",
|
||||
"next": "^15.3.0",
|
||||
"next": "^15.3.3",
|
||||
"rollup": "^4.28.1",
|
||||
"tsx": "^4.19.3",
|
||||
"typescript": "^5.7.3",
|
||||
"tsx": "^4.20.3",
|
||||
"typescript": "^5.8.3",
|
||||
"vitest": "^2.1.5",
|
||||
"webpack": "^5.97.1"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,36 @@
|
||||
# @llamaindex/cloud
|
||||
|
||||
## 4.0.20
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 48b0d88: fix: exports in `api` submodule
|
||||
- f185772: fix(cloud): missing file
|
||||
|
||||
## 4.0.19
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 5a0ed1f: feat: init agent api on cloud sdk
|
||||
- 5a0ed1f: feat: init agent api on cloud sdk
|
||||
- Updated dependencies [8eeac33]
|
||||
- @llamaindex/core@0.6.14
|
||||
|
||||
## 4.0.18
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 47a7555: chore: bump sdk version
|
||||
|
||||
## 4.0.17
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies [d578889]
|
||||
- Updated dependencies [0fcc92f]
|
||||
- Updated dependencies [515a8b9]
|
||||
- @llamaindex/core@0.6.13
|
||||
|
||||
## 4.0.16
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"type": "module",
|
||||
"main": "./dist/index.cjs",
|
||||
"module": "./dist/index.js",
|
||||
"types": "./dist/index.d.ts",
|
||||
"exports": "./dist/index.js",
|
||||
"private": true
|
||||
}
|
||||
+2534
-114
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@llamaindex/cloud",
|
||||
"version": "4.0.16",
|
||||
"version": "4.0.20",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
@@ -11,10 +11,23 @@
|
||||
"files": [
|
||||
"openapi.json",
|
||||
"./api",
|
||||
"./reader"
|
||||
"./reader",
|
||||
"./parse",
|
||||
"./agent"
|
||||
],
|
||||
"exports": {
|
||||
"./openapi.json": "./openapi.json",
|
||||
"./agent": {
|
||||
"require": {
|
||||
"types": "./agent/dist/index.d.cts",
|
||||
"default": "./agent/dist/index.cjs"
|
||||
},
|
||||
"import": {
|
||||
"types": "./agent/dist/index.d.ts",
|
||||
"default": "./agent/dist/index.js"
|
||||
},
|
||||
"default": "./agent/dist/index.js"
|
||||
},
|
||||
"./api": {
|
||||
"require": {
|
||||
"types": "./api/dist/index.d.cts",
|
||||
@@ -79,6 +92,6 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"p-retry": "^6.2.1",
|
||||
"zod": "^3.25.67"
|
||||
"zod": "^3.25.76"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,291 @@
|
||||
import { createClient, createConfig } from "@hey-api/client-fetch";
|
||||
import { getEnv } from "@llamaindex/env";
|
||||
import pRetry from "p-retry";
|
||||
import {
|
||||
createAgentDataApiV1BetaAgentDataPost,
|
||||
deleteAgentDataApiV1BetaAgentDataItemIdDelete,
|
||||
getAgentDataApiV1BetaAgentDataItemIdGet,
|
||||
searchAgentDataApiV1BetaAgentDataSearchPost,
|
||||
updateAgentDataApiV1BetaAgentDataItemIdPut,
|
||||
type AgentData,
|
||||
} from "../client";
|
||||
import type {
|
||||
CreateAgentDataOptions,
|
||||
ExtractedData,
|
||||
ExtractOptions,
|
||||
ListAgentDataOptions,
|
||||
TypedAgentData,
|
||||
TypedAgentDataItems,
|
||||
UpdateAgentDataOptions,
|
||||
} from "./types";
|
||||
|
||||
/**
|
||||
* Async client for agent data operations
|
||||
*/
|
||||
export class AgentClient {
|
||||
private client: ReturnType<typeof createClient>;
|
||||
private baseUrl: string;
|
||||
private headers: Record<string, string>;
|
||||
|
||||
constructor(options?: { apiKey?: string; baseUrl?: string }) {
|
||||
const apiKey = options?.apiKey || getEnv("LLAMA_CLOUD_API_KEY");
|
||||
this.baseUrl = options?.baseUrl || "https://api.cloud.llamaindex.ai/";
|
||||
|
||||
this.headers = {
|
||||
"X-SDK-Name": "llamaindex-ts",
|
||||
...(apiKey && { Authorization: `Bearer ${apiKey}` }),
|
||||
};
|
||||
|
||||
this.client = createClient(
|
||||
createConfig({
|
||||
baseUrl: this.baseUrl,
|
||||
headers: this.headers,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new agent data
|
||||
*/
|
||||
async create<T = unknown>(
|
||||
options: CreateAgentDataOptions<T>,
|
||||
): Promise<TypedAgentData<T>> {
|
||||
const response = await createAgentDataApiV1BetaAgentDataPost({
|
||||
throwOnError: true,
|
||||
body: {
|
||||
agent_slug: options.agentSlug,
|
||||
...(options.collection !== undefined && {
|
||||
collection: options.collection,
|
||||
}),
|
||||
data: options.data as Record<string, unknown>,
|
||||
},
|
||||
client: this.client,
|
||||
});
|
||||
|
||||
return this.transformResponse(response.data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get agent data by ID
|
||||
*/
|
||||
async get<T = unknown>(id: string): Promise<TypedAgentData<T> | null> {
|
||||
try {
|
||||
const response = await getAgentDataApiV1BetaAgentDataItemIdGet({
|
||||
throwOnError: true,
|
||||
path: { item_id: id },
|
||||
client: this.client,
|
||||
});
|
||||
|
||||
return this.transformResponse(response.data);
|
||||
} catch (error) {
|
||||
if (
|
||||
error instanceof Error &&
|
||||
"response" in error &&
|
||||
(error as { response?: { status?: number } }).response?.status === 404
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update agent data
|
||||
*/
|
||||
async update<T = unknown>(
|
||||
id: string,
|
||||
options: UpdateAgentDataOptions<T>,
|
||||
): Promise<TypedAgentData<T>> {
|
||||
const response = await updateAgentDataApiV1BetaAgentDataItemIdPut({
|
||||
throwOnError: true,
|
||||
path: { item_id: id },
|
||||
body: {
|
||||
data: options.data as Record<string, unknown>,
|
||||
},
|
||||
client: this.client,
|
||||
});
|
||||
|
||||
return this.transformResponse(response.data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete agent data
|
||||
*/
|
||||
async delete(id: string): Promise<void> {
|
||||
await deleteAgentDataApiV1BetaAgentDataItemIdDelete({
|
||||
throwOnError: true,
|
||||
path: { item_id: id },
|
||||
client: this.client,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* List agent data
|
||||
*/
|
||||
async list<T = unknown>(
|
||||
options: ListAgentDataOptions,
|
||||
): Promise<TypedAgentDataItems<T>> {
|
||||
const response = await searchAgentDataApiV1BetaAgentDataSearchPost({
|
||||
throwOnError: true,
|
||||
body: {
|
||||
agent_slug: options.agentSlug,
|
||||
...(options.collection !== undefined && {
|
||||
collection: options.collection,
|
||||
}),
|
||||
...(options.filter !== undefined && { filter: options.filter }),
|
||||
...(options.orderBy !== undefined && { order_by: options.orderBy }),
|
||||
...(options.pageSize !== undefined && { page_size: options.pageSize }),
|
||||
...(options.pageToken !== undefined && {
|
||||
page_token: options.pageToken,
|
||||
}),
|
||||
...(options.offset !== undefined && { offset: options.offset }),
|
||||
},
|
||||
client: this.client,
|
||||
});
|
||||
|
||||
const result: TypedAgentDataItems<T> = {
|
||||
items: response.data.items.map((item: AgentData) =>
|
||||
this.transformResponse(item),
|
||||
),
|
||||
};
|
||||
|
||||
if (
|
||||
response.data.total_size !== null &&
|
||||
response.data.total_size !== undefined
|
||||
) {
|
||||
result.totalSize = response.data.total_size;
|
||||
}
|
||||
|
||||
if (
|
||||
response.data.next_page_token !== null &&
|
||||
response.data.next_page_token !== undefined
|
||||
) {
|
||||
result.nextPageToken = response.data.next_page_token;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract data from agent with retry logic
|
||||
*/
|
||||
async extract<T = unknown>(
|
||||
agentId: string,
|
||||
input: unknown,
|
||||
options?: ExtractOptions,
|
||||
): Promise<ExtractedData<T>> {
|
||||
const extractOptions = {
|
||||
retries: options?.retryCount || 3,
|
||||
onFailedAttempt: (error: {
|
||||
attemptNumber: number;
|
||||
retriesLeft: number;
|
||||
}) => {
|
||||
console.log(
|
||||
`Extraction attempt ${error.attemptNumber} failed. ${error.retriesLeft} retries left.`,
|
||||
);
|
||||
},
|
||||
minTimeout: options?.retryDelay || 1000,
|
||||
maxTimeout: options?.timeout || 30000,
|
||||
};
|
||||
|
||||
return pRetry(async () => {
|
||||
// Note: The extract endpoint might not be in the generated client yet
|
||||
// Using the native fetch API for this endpoint
|
||||
const response = await fetch(
|
||||
`${this.baseUrl}/api/v1/beta/agent-data/${agentId}/extract`,
|
||||
{
|
||||
method: "POST",
|
||||
body: JSON.stringify({ input }),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
...this.headers,
|
||||
},
|
||||
},
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to extract data: ${response.statusText}`);
|
||||
}
|
||||
|
||||
const extractedData = (await response.json()) as ExtractedData<T>;
|
||||
|
||||
// If status is still pending or in progress, poll for completion
|
||||
if (
|
||||
extractedData.status === "pending" ||
|
||||
extractedData.status === "in_progress"
|
||||
) {
|
||||
return this.pollExtraction<T>(extractedData.id, options);
|
||||
}
|
||||
|
||||
return extractedData;
|
||||
}, extractOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Poll for extraction completion
|
||||
*/
|
||||
private async pollExtraction<T = unknown>(
|
||||
extractionId: string,
|
||||
options?: ExtractOptions,
|
||||
): Promise<ExtractedData<T>> {
|
||||
const pollInterval = 2000; // 2 seconds
|
||||
const maxAttempts = Math.floor((options?.timeout || 30000) / pollInterval);
|
||||
|
||||
for (let i = 0; i < maxAttempts; i++) {
|
||||
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
||||
|
||||
const response = await fetch(
|
||||
`${this.baseUrl}/api/v1/extractions/${extractionId}`,
|
||||
{
|
||||
headers: this.headers,
|
||||
},
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(
|
||||
`Failed to get extraction status: ${response.statusText}`,
|
||||
);
|
||||
}
|
||||
|
||||
const extractedData = (await response.json()) as ExtractedData<T>;
|
||||
|
||||
if (
|
||||
extractedData.status === "completed" ||
|
||||
extractedData.status === "failed"
|
||||
) {
|
||||
return extractedData;
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error("Extraction timeout exceeded");
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform API response to typed data
|
||||
*/
|
||||
private transformResponse<T = unknown>(data: AgentData): TypedAgentData<T> {
|
||||
const result: TypedAgentData<T> = {
|
||||
id: data.id!,
|
||||
agentSlug: data.agent_slug,
|
||||
data: data.data as T,
|
||||
createdAt: new Date(data.created_at!),
|
||||
updatedAt: new Date(data.updated_at!),
|
||||
};
|
||||
|
||||
if (data.collection !== undefined) {
|
||||
result.collection = data.collection;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new AsyncAgentDataClient instance
|
||||
*/
|
||||
export function createAgentDataClient(options?: {
|
||||
apiKey?: string;
|
||||
baseUrl?: string;
|
||||
}): AgentClient {
|
||||
return new AgentClient(options);
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
export { AgentClient, createAgentDataClient } from "./client";
|
||||
|
||||
export type {
|
||||
AgentDataT,
|
||||
CreateAgentDataOptions,
|
||||
ExtractOptions,
|
||||
ExtractedData,
|
||||
ExtractedT,
|
||||
FilterOperation,
|
||||
ListAgentDataOptions,
|
||||
SortOptions,
|
||||
StatusType,
|
||||
TypedAgentData,
|
||||
TypedAgentDataItems,
|
||||
UpdateAgentDataOptions,
|
||||
} from "./types";
|
||||
|
||||
export { StatusType as StatusTypeEnum } from "./types";
|
||||
@@ -0,0 +1,98 @@
|
||||
/**
|
||||
* Status types for agent data processing
|
||||
*/
|
||||
export enum StatusType {
|
||||
PENDING = "pending",
|
||||
IN_PROGRESS = "in_progress",
|
||||
COMPLETED = "completed",
|
||||
FAILED = "failed",
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter operation for searching/filtering agent data
|
||||
*/
|
||||
export interface FilterOperation {
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Base extracted data interface
|
||||
*/
|
||||
export interface ExtractedData<T = unknown> {
|
||||
id: string;
|
||||
status: StatusType;
|
||||
data?: T;
|
||||
error?: string;
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
}
|
||||
|
||||
/**
|
||||
* TypedAgentData interface for typed agent data
|
||||
*/
|
||||
export interface TypedAgentData<T = unknown> {
|
||||
id: string;
|
||||
agentSlug: string;
|
||||
collection?: string;
|
||||
data: T;
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
}
|
||||
|
||||
/**
|
||||
* Collection of typed agent data items
|
||||
*/
|
||||
export interface TypedAgentDataItems<T = unknown> {
|
||||
items: TypedAgentData<T>[];
|
||||
totalSize?: number;
|
||||
nextPageToken?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Options for creating agent data
|
||||
*/
|
||||
export interface CreateAgentDataOptions<T = unknown> {
|
||||
agentSlug: string;
|
||||
collection?: string;
|
||||
data: T;
|
||||
}
|
||||
|
||||
/**
|
||||
* Options for updating agent data
|
||||
*/
|
||||
export interface UpdateAgentDataOptions<T = unknown> {
|
||||
data: T;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort options for listing
|
||||
*/
|
||||
export interface SortOptions {
|
||||
field: string;
|
||||
order: "asc" | "desc";
|
||||
}
|
||||
|
||||
/**
|
||||
* Options for listing agent data
|
||||
*/
|
||||
export interface ListAgentDataOptions {
|
||||
agentSlug: string;
|
||||
collection?: string;
|
||||
filter?: Record<string, FilterOperation>;
|
||||
orderBy?: string;
|
||||
pageSize?: number;
|
||||
pageToken?: string;
|
||||
offset?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Options for extraction
|
||||
*/
|
||||
export interface ExtractOptions {
|
||||
timeout?: number;
|
||||
retryCount?: number;
|
||||
retryDelay?: number;
|
||||
}
|
||||
|
||||
export type ExtractedT<T> = T;
|
||||
export type AgentDataT<T> = T;
|
||||
@@ -171,6 +171,14 @@ export class LlamaParseReader extends FileReader {
|
||||
replace_failed_page_with_error_message_suffix?: string | undefined;
|
||||
save_images?: boolean | undefined;
|
||||
preset?: string | undefined;
|
||||
high_res_ocr?: boolean | undefined;
|
||||
outlined_table_extraction?: boolean | undefined;
|
||||
hide_headers?: boolean | undefined;
|
||||
hide_footers?: boolean | undefined;
|
||||
page_header_prefix?: string | undefined;
|
||||
page_header_suffix?: string | undefined;
|
||||
page_footer_prefix?: string | undefined;
|
||||
page_footer_suffix?: string | undefined;
|
||||
|
||||
constructor(
|
||||
params: Partial<Omit<LlamaParseReader, "language" | "apiKey">> & {
|
||||
@@ -352,6 +360,14 @@ export class LlamaParseReader extends FileReader {
|
||||
this.replace_failed_page_with_error_message_suffix,
|
||||
save_images: this.save_images,
|
||||
preset: this.preset,
|
||||
high_res_ocr: this.high_res_ocr,
|
||||
outlined_table_extraction: this.outlined_table_extraction,
|
||||
hide_headers: this.hide_headers,
|
||||
hide_footers: this.hide_footers,
|
||||
page_header_prefix: this.page_header_prefix,
|
||||
page_header_suffix: this.page_header_suffix,
|
||||
page_footer_prefix: this.page_footer_prefix,
|
||||
page_footer_suffix: this.page_footer_suffix,
|
||||
} satisfies {
|
||||
[Key in keyof BodyUploadFileApiParsingUploadPost]-?:
|
||||
| BodyUploadFileApiParsingUploadPost[Key]
|
||||
|
||||
@@ -1,5 +1,19 @@
|
||||
# @llamaindex/core
|
||||
|
||||
## 0.6.14
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- 8eeac33: Fix createMemory factory when parsing options
|
||||
|
||||
## 0.6.13
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- d578889: Add new memory API
|
||||
- 0fcc92f: Fix: split sentences must not trim whitespaces
|
||||
- 515a8b9: Fix: logging for fromPersistPath
|
||||
|
||||
## 0.6.12
|
||||
|
||||
### Patch Changes
|
||||
@@ -426,7 +440,6 @@
|
||||
### Patch Changes
|
||||
|
||||
- 8b7fdba: refactor: move chat engine & retriever into core.
|
||||
|
||||
- `chatHistory` in BaseChatEngine now returns `ChatMessage[] | Promise<ChatMessage[]>`, instead of `BaseMemory`
|
||||
- update `retrieve-end` type
|
||||
|
||||
@@ -452,7 +465,6 @@
|
||||
### Patch Changes
|
||||
|
||||
- 2cd1383: refactor: align `response-synthesizers` & `chat-engine` module
|
||||
|
||||
- builtin event system
|
||||
- correct class extends
|
||||
- aligin APIs, naming with llama-index python
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@llamaindex/core",
|
||||
"type": "module",
|
||||
"version": "0.6.12",
|
||||
"version": "0.6.14",
|
||||
"description": "LlamaIndex Core Module",
|
||||
"exports": {
|
||||
"./agent": {
|
||||
@@ -310,9 +310,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@llamaindex/env": "workspace:*",
|
||||
"@types/node": "^22.9.0",
|
||||
"@types/node": "^24.0.13",
|
||||
"magic-bytes.js": "^1.10.0",
|
||||
"zod": "^3.25.67",
|
||||
"zod": "^3.25.76",
|
||||
"zod-to-json-schema": "^3.24.6"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,6 +152,7 @@ export type AgentParamsBase<
|
||||
|
||||
/**
|
||||
* Worker will schedule tasks and handle the task execution
|
||||
* @deprecated Use agent instead.
|
||||
*/
|
||||
export abstract class AgentWorker<
|
||||
AI extends LLM,
|
||||
@@ -250,6 +251,7 @@ export abstract class AgentWorker<
|
||||
|
||||
/**
|
||||
* Runner will manage the task execution and provide a high-level API for the user
|
||||
* @deprecated Use agent instead.
|
||||
*/
|
||||
export abstract class AgentRunner<
|
||||
AI extends LLM,
|
||||
|
||||
@@ -62,6 +62,9 @@ export class LLMAgentWorker extends AgentWorker<LLM> {
|
||||
taskHandler = AgentRunner.defaultTaskHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use agent instead.
|
||||
*/
|
||||
export class LLMAgent extends AgentRunner<LLM> {
|
||||
constructor(params: LLMAgentParams<LLM>) {
|
||||
validateAgentParams(params);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { ChatMessage, MessageContent } from "../llms";
|
||||
import type { BaseMemory } from "../memory";
|
||||
import type { Memory } from "../memory";
|
||||
import { EngineResponse } from "../schema";
|
||||
|
||||
export interface BaseChatEngineParams<
|
||||
@@ -9,9 +9,7 @@ export interface BaseChatEngineParams<
|
||||
/**
|
||||
* Optional chat history if you want to customize the chat history.
|
||||
*/
|
||||
chatHistory?:
|
||||
| ChatMessage<AdditionalMessageOptions>[]
|
||||
| BaseMemory<AdditionalMessageOptions>;
|
||||
chatHistory?: ChatMessage<AdditionalMessageOptions>[] | Memory;
|
||||
}
|
||||
|
||||
export interface StreamingChatEngineParams<
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { wrapEventCaller } from "../decorator";
|
||||
import { Settings } from "../global";
|
||||
import type { ChatMessage, LLM, MessageContent, MessageType } from "../llms";
|
||||
import { BaseMemory, ChatMemoryBuffer } from "../memory";
|
||||
import { Memory, createMemory } from "../memory";
|
||||
import type { BaseNodePostprocessor } from "../postprocessor";
|
||||
import {
|
||||
type ContextSystemPrompt,
|
||||
@@ -23,7 +23,7 @@ import type { ContextGenerator } from "./type";
|
||||
export type ContextChatEngineOptions = {
|
||||
retriever: BaseRetriever;
|
||||
chatModel?: LLM | undefined;
|
||||
chatHistory?: ChatMessage[] | undefined;
|
||||
chatHistory?: ChatMessage[] | Memory | undefined;
|
||||
contextSystemPrompt?: ContextSystemPrompt | undefined;
|
||||
nodePostprocessors?: BaseNodePostprocessor[] | undefined;
|
||||
systemPrompt?: string | undefined;
|
||||
@@ -37,18 +37,21 @@ export type ContextChatEngineOptions = {
|
||||
*/
|
||||
export class ContextChatEngine extends PromptMixin implements BaseChatEngine {
|
||||
chatModel: LLM;
|
||||
memory: BaseMemory;
|
||||
memory: Memory;
|
||||
contextGenerator: ContextGenerator & PromptMixin;
|
||||
systemPrompt?: string | undefined;
|
||||
|
||||
get chatHistory() {
|
||||
return this.memory.getMessages();
|
||||
return this.memory.getLLM();
|
||||
}
|
||||
|
||||
constructor(init: ContextChatEngineOptions) {
|
||||
super();
|
||||
this.chatModel = init.chatModel ?? Settings.llm;
|
||||
this.memory = new ChatMemoryBuffer({ chatHistory: init?.chatHistory });
|
||||
this.memory =
|
||||
init?.chatHistory instanceof Memory
|
||||
? init.chatHistory
|
||||
: createMemory(init?.chatHistory ?? []);
|
||||
this.contextGenerator = new DefaultContextGenerator({
|
||||
retriever: init.retriever,
|
||||
contextSystemPrompt: init?.contextSystemPrompt,
|
||||
@@ -87,12 +90,9 @@ export class ContextChatEngine extends PromptMixin implements BaseChatEngine {
|
||||
): Promise<EngineResponse | AsyncIterable<EngineResponse>> {
|
||||
const { message, stream } = params;
|
||||
const chatHistory = params.chatHistory
|
||||
? new ChatMemoryBuffer({
|
||||
chatHistory:
|
||||
params.chatHistory instanceof BaseMemory
|
||||
? await params.chatHistory.getMessages()
|
||||
: params.chatHistory,
|
||||
})
|
||||
? params.chatHistory instanceof Memory
|
||||
? params.chatHistory
|
||||
: createMemory(params.chatHistory)
|
||||
: this.memory;
|
||||
const requestMessages = await this.prepareRequestMessages(
|
||||
message,
|
||||
@@ -110,7 +110,7 @@ export class ContextChatEngine extends PromptMixin implements BaseChatEngine {
|
||||
initialValue: "",
|
||||
reducer: (accumulator, part) => (accumulator += part.delta),
|
||||
finished: (accumulator) => {
|
||||
chatHistory.put({ content: accumulator, role: "assistant" });
|
||||
void chatHistory.add({ content: accumulator, role: "assistant" });
|
||||
},
|
||||
}),
|
||||
(r) => EngineResponse.fromChatResponseChunk(r, requestMessages.nodes),
|
||||
@@ -120,26 +120,26 @@ export class ContextChatEngine extends PromptMixin implements BaseChatEngine {
|
||||
messages: requestMessages.messages,
|
||||
additionalChatOptions: params.chatOptions as object,
|
||||
});
|
||||
chatHistory.put(response.message);
|
||||
await chatHistory.add(response.message);
|
||||
return EngineResponse.fromChatResponse(response, requestMessages.nodes);
|
||||
}
|
||||
|
||||
reset() {
|
||||
this.memory.reset();
|
||||
async reset() {
|
||||
await this.memory.clear();
|
||||
}
|
||||
|
||||
private async prepareRequestMessages(
|
||||
message: MessageContent,
|
||||
chatHistory: BaseMemory,
|
||||
chatHistory: Memory,
|
||||
) {
|
||||
chatHistory.put({
|
||||
await chatHistory.add({
|
||||
content: message,
|
||||
role: "user",
|
||||
});
|
||||
const textOnly = extractText(message);
|
||||
const context = await this.contextGenerator.generate(textOnly);
|
||||
const systemMessage = this.prependSystemPrompt(context.message);
|
||||
const messages = await chatHistory.getMessages([systemMessage]);
|
||||
const messages = await chatHistory.getLLM(this.chatModel, [systemMessage]);
|
||||
return { nodes: context.nodes, messages };
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { LLM } from "../llms";
|
||||
import { BaseMemory, ChatMemoryBuffer } from "../memory";
|
||||
import { createMemory, Memory } from "../memory";
|
||||
import { EngineResponse } from "../schema";
|
||||
import { streamConverter, streamReducer } from "../utils";
|
||||
import type {
|
||||
@@ -16,20 +16,16 @@ import { Settings } from "../global";
|
||||
*/
|
||||
|
||||
export class SimpleChatEngine implements BaseChatEngine {
|
||||
memory: BaseMemory;
|
||||
memory: Memory;
|
||||
llm: LLM;
|
||||
|
||||
get chatHistory() {
|
||||
return this.memory.getMessages();
|
||||
return this.memory.getLLM();
|
||||
}
|
||||
|
||||
constructor(init?: Partial<SimpleChatEngine>) {
|
||||
this.llm = init?.llm ?? Settings.llm;
|
||||
this.memory =
|
||||
init?.memory ??
|
||||
new ChatMemoryBuffer({
|
||||
llm: this.llm,
|
||||
});
|
||||
this.memory = init?.memory ?? createMemory();
|
||||
}
|
||||
|
||||
chat(params: NonStreamingChatEngineParams): Promise<EngineResponse>;
|
||||
@@ -43,19 +39,15 @@ export class SimpleChatEngine implements BaseChatEngine {
|
||||
const { message, stream } = params;
|
||||
|
||||
const chatHistory = params.chatHistory
|
||||
? new ChatMemoryBuffer({
|
||||
llm: this.llm,
|
||||
chatHistory:
|
||||
params.chatHistory instanceof BaseMemory
|
||||
? await params.chatHistory.getMessages()
|
||||
: params.chatHistory,
|
||||
})
|
||||
? params.chatHistory instanceof Memory
|
||||
? params.chatHistory
|
||||
: createMemory(params.chatHistory)
|
||||
: this.memory;
|
||||
chatHistory.put({ content: message, role: "user" });
|
||||
await chatHistory.add({ content: message, role: "user" });
|
||||
|
||||
if (stream) {
|
||||
const stream = await this.llm.chat({
|
||||
messages: await chatHistory.getMessages(),
|
||||
messages: await chatHistory.getLLM(this.llm),
|
||||
stream: true,
|
||||
});
|
||||
return streamConverter(
|
||||
@@ -64,7 +56,7 @@ export class SimpleChatEngine implements BaseChatEngine {
|
||||
initialValue: "",
|
||||
reducer: (accumulator, part) => accumulator + part.delta,
|
||||
finished: (accumulator) => {
|
||||
chatHistory.put({ content: accumulator, role: "assistant" });
|
||||
void chatHistory.add({ content: accumulator, role: "assistant" });
|
||||
},
|
||||
}),
|
||||
EngineResponse.fromChatResponseChunk,
|
||||
@@ -73,13 +65,13 @@ export class SimpleChatEngine implements BaseChatEngine {
|
||||
|
||||
const response = await this.llm.chat({
|
||||
stream: false,
|
||||
messages: await chatHistory.getMessages(),
|
||||
messages: await chatHistory.getLLM(this.llm),
|
||||
});
|
||||
chatHistory.put(response.message);
|
||||
await chatHistory.add(response.message);
|
||||
return EngineResponse.fromChatResponse(response);
|
||||
}
|
||||
|
||||
reset() {
|
||||
this.memory.reset();
|
||||
async reset() {
|
||||
await this.memory.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
import type { MemoryMessage } from "../types";
|
||||
|
||||
export interface MessageAdapter<T, TMessageOptions extends object = object> {
|
||||
fromMemory(message: MemoryMessage<TMessageOptions>): T;
|
||||
toMemory(message: T): MemoryMessage<TMessageOptions>;
|
||||
isCompatible(message: unknown): message is T;
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import { randomUUID } from "@llamaindex/env";
|
||||
import type { ChatMessage } from "../../llms";
|
||||
import type { MemoryMessage } from "../types";
|
||||
import { type MessageAdapter } from "./base";
|
||||
|
||||
export class ChatMessageAdapter<
|
||||
AdditionalMessageOptions extends object = object,
|
||||
> implements
|
||||
MessageAdapter<
|
||||
ChatMessage<AdditionalMessageOptions>,
|
||||
AdditionalMessageOptions
|
||||
>
|
||||
{
|
||||
fromMemory(
|
||||
message: MemoryMessage<AdditionalMessageOptions>,
|
||||
): ChatMessage<AdditionalMessageOptions> {
|
||||
return {
|
||||
content: message.content,
|
||||
role: message.role,
|
||||
options: message.options,
|
||||
};
|
||||
}
|
||||
toMemory(
|
||||
message: ChatMessage<AdditionalMessageOptions>,
|
||||
): MemoryMessage<AdditionalMessageOptions> {
|
||||
return {
|
||||
id: randomUUID(),
|
||||
createdAt: new Date(),
|
||||
...message,
|
||||
};
|
||||
}
|
||||
isCompatible(
|
||||
message: unknown,
|
||||
): message is ChatMessage<AdditionalMessageOptions> {
|
||||
return !!(
|
||||
message &&
|
||||
typeof message === "object" &&
|
||||
"role" in message &&
|
||||
message.role &&
|
||||
"content" in message
|
||||
);
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user