Compare commits

...

54 Commits

Author SHA1 Message Date
github-actions[bot] a2bbd62399 Release 0.8.22 (#1520)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-21 23:17:45 -08:00
Alex Yang 969365ca0a feat: add cloudflare worker full example (#1521) 2024-11-21 23:05:40 -08:00
fatmelon 819af453d6 feat: add Azure CosmosDB Mongo vCore Chat store (#1516)
Co-authored-by: root <root@CPC-yangq-FRSGK>
2024-11-21 21:25:41 -08:00
github-actions[bot] 9db36f7384 Release 0.8.21 (#1513)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-19 18:18:35 -08:00
fatmelon efa221116f feat: integrate with azure cosmos db mongo vCore (#1500)
Co-authored-by: root <root@CPC-yangq-FRSGK>
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-11-19 17:58:25 -08:00
Alex Yang 83c3897539 fix: pinecone vector store (#1512) 2024-11-19 17:51:45 -08:00
github-actions[bot] e1cbce1f80 Release 0.8.20 (#1511)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-19 10:01:18 -08:00
Madarco 02b22da384 fix: supports vercel bundling (#1509)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-11-19 09:52:56 -08:00
github-actions[bot] 0aa61db547 Release 0.8.19 (#1507)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-19 00:01:48 -08:00
Alex Yang 90d265cf47 chore: bump version (#1505) 2024-11-18 18:39:13 -08:00
github-actions[bot] fc2d5ea1cd Release 0.8.18 (#1506)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-18 13:08:32 -08:00
Thuc Pham ef4f63d9f4 refactor: move mockLLM to core (#1493)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-11-18 11:39:46 -08:00
Thuc Pham d17450fdfb fix: next.js 15 compatibility (#1474)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-11-18 11:34:05 -08:00
github-actions[bot] 805d2b0d55 Release 0.8.17 (#1504)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-18 10:28:15 -08:00
Marcus Schiesser 6d22fa2a50 feat: Get PromptTemplate template variables at run-time (#1502) 2024-11-18 09:34:26 -08:00
Aman Rao 16f0068175 chore: update azure cosmos db no sql vector store (#1503) 2024-11-18 09:33:20 -08:00
github-actions[bot] 1054c3382a Release 0.8.16 (#1499)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-17 22:28:02 -08:00
Alex Yang e60328b086 fix: import error in cjs (#1498) 2024-11-17 22:24:09 -08:00
Laurie Voss 3371dfb89f Syncing footer to match main site (#1496) 2024-11-16 00:43:44 -08:00
github-actions[bot] 2065a16a07 Release 0.8.15 (#1494)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-15 11:27:52 -08:00
Wassim Chegham 5dae534f8d fix: propagate queryStr to concrete vectorStore (#1495)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-11-15 11:16:32 -08:00
Aman Rao 3d503cb810 chore: update azure cosmos db (#1484)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-11-15 00:55:32 -08:00
Thuc Pham daf8522bec feat: use mock llm (#1492) 2024-11-15 14:50:49 +08:00
github-actions[bot] 223f3136b4 Release 0.8.14 (#1491)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-14 21:49:37 -08:00
Thuc Pham c6bad7d951 docs(next): chat UI with rsc example (#1481)
Co-authored-by: Marcus Schiesser <mail@marcusschiesser.de>
2024-11-14 21:33:30 -08:00
Aman Rao 630b425545 feat: add Azure CosmosDB NoSql Chat store (#1490)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-11-14 21:30:55 -08:00
github-actions[bot] 4c7b891446 Release 0.8.13 (#1480)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: himself65 <himself65@users.noreply.github.com>
2024-11-14 18:25:19 -08:00
Alex Yang a9c5b4899b docs: update docusaurus.config.js (#1489) 2024-11-14 17:36:52 -08:00
Alex Yang a7b0ac3cb7 feat(anthropic): support prompt caching (#1488) 2024-11-14 17:35:21 -08:00
Alex Yang a7540ff47b docs: update (#1486) 2024-11-14 15:46:48 -08:00
Aman Rao c69605f406 feat: add async support to BaseChatStore and BaseChatStoreMemory (#1483)
Co-authored-by: Alex Yang <himself65@outlook.com>
2024-11-14 13:45:50 -08:00
Alex Yang ee20c44d9b feat(workflow): allow send event with no output (#1479) 2024-11-14 00:17:53 -08:00
Alex Yang 1d470363df docs: add banner for legacy (#1478) 2024-11-13 18:16:13 -08:00
github-actions[bot] b39f40dbd8 Release (#1477)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: himself65 <himself65@users.noreply.github.com>
2024-11-13 01:25:40 -08:00
Alex Yang fadc8b8ea0 feat: recoverable data with error handling (#1476) 2024-11-13 01:15:50 -08:00
Alex Yang ea92b6986d chore: update changeset 2024-11-13 01:15:28 -08:00
Alex Yang 17f9022d22 fix: output event check (#1475) 2024-11-13 00:46:35 -08:00
github-actions[bot] 14792cd8b4 Release 0.8.12 (#1473)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-12 16:20:25 -08:00
Alex Yang 7ae6eaa0a2 chore: update changeset 2024-11-12 12:49:17 -08:00
Alex Yang dbb5bd9f23 feat: allow tool_choice for OpenAIAgent (#1472) 2024-11-12 12:46:57 -08:00
github-actions[bot] aacd606204 Release 0.8.11 (#1471)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-12 11:49:22 -08:00
Alex Yang f865c984d3 feat: async get message on chat store (#1470) 2024-11-12 10:59:44 -08:00
github-actions[bot] 7b10882d06 Release 0.8.10 (#1466)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: himself65 <himself65@users.noreply.github.com>
2024-11-11 14:19:46 -08:00
Alex Yang f066e50482 feat: vllm support (#1468) 2024-11-11 13:14:08 -08:00
Alex Yang fd8c882792 refactor: migrate example to new workflow API (#1467) 2024-11-11 12:03:38 -08:00
Alex Yang d89ebe0261 chore: update changeset 2024-11-11 10:11:04 -08:00
Alex Yang 968feb32cd feat: better input type for function tool with zod (#1464) 2024-11-11 10:10:03 -08:00
Alex Yang 43f6f56c5b docs(next): fix turbo.json (#1465) 2024-11-11 10:07:12 -08:00
github-actions[bot] b2364dc5ba Release 0.8.9 (#1460)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-11-10 23:32:41 -08:00
Alex Yang 67f4db8501 fix: steaming chat in ollama (#1463) 2024-11-10 23:27:09 -08:00
Alex Yang e4151a8b02 feat: support ollama agent (#1462) 2024-11-10 22:38:40 -08:00
Alex Yang 4d4cd8ac6b feat: support ollama tool call (#1461) 2024-11-10 20:46:46 -08:00
Alex Yang 4fc001c8de chore: bump @huggingface/transformers (#1459) 2024-11-10 20:14:44 -08:00
Alex Yang cf675bdc7a chore: bump version (#1458) 2024-11-10 16:43:45 -08:00
172 changed files with 9206 additions and 3578 deletions
+7 -3
View File
@@ -1,12 +1,16 @@
# LlamaIndex.TS
<p align="center">
<img height="100" width="100" alt="LlamaIndex logo" src="https://ts.llamaindex.ai/square.svg" />
</p>
<h1 align="center">LlamaIndex.TS</h1>
<h3 align="center">
Data framework for your LLM application.
</h3>
[![NPM Version](https://img.shields.io/npm/v/llamaindex)](https://www.npmjs.com/package/llamaindex)
[![NPM License](https://img.shields.io/npm/l/llamaindex)](https://www.npmjs.com/package/llamaindex)
[![NPM Downloads](https://img.shields.io/npm/dm/llamaindex)](https://www.npmjs.com/package/llamaindex)
[![Discord](https://img.shields.io/discord/1059199217496772688)](https://discord.com/invite/eN6D2HQ4aX)
LlamaIndex is a data framework for your LLM application.
Use your own data with large language models (LLMs, OpenAI ChatGPT and others) in JS runtime environments with TypeScript support.
Documentation: https://ts.llamaindex.ai/
+104
View File
@@ -1,5 +1,109 @@
# docs
## 0.0.127
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
## 0.0.126
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
## 0.0.125
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
## 0.0.124
### Patch Changes
- Updated dependencies [90d265c]
- llamaindex@0.8.19
## 0.0.123
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
## 0.0.122
### Patch Changes
- llamaindex@0.8.17
## 0.0.121
### Patch Changes
- llamaindex@0.8.16
## 0.0.120
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
## 0.0.119
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
## 0.0.118
### Patch Changes
- llamaindex@0.8.13
- @llamaindex/examples@0.0.16
## 0.0.117
### Patch Changes
- @llamaindex/examples@0.0.15
## 0.0.116
### Patch Changes
- llamaindex@0.8.12
## 0.0.115
### Patch Changes
- llamaindex@0.8.11
## 0.0.114
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
- @llamaindex/examples@0.0.14
## 0.0.113
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 0.0.112
### Patch Changes
+6
View File
@@ -62,6 +62,12 @@ const config = {
({
// Replace with your project's social card
image: "img/favicon.png", // TODO change this
announcementBar: {
id: "migrate_to_next",
content:
'We are migrating to Next.js based documentation. Check it out <a href="https://ts.llamaindex.ai/docs/llamaindex">here</a>!',
isCloseable: false,
},
navbar: {
title: "LlamaIndex.TS",
logo: {
+8 -8
View File
@@ -1,6 +1,6 @@
{
"name": "docs",
"version": "0.0.112",
"version": "0.0.127",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
@@ -15,23 +15,23 @@
"typecheck": "tsc"
},
"dependencies": {
"@docusaurus/core": "3.6.0",
"@docusaurus/remark-plugin-npm2yarn": "3.6.0",
"@docusaurus/core": "3.6.1",
"@docusaurus/remark-plugin-npm2yarn": "3.6.1",
"@llamaindex/examples": "workspace:*",
"@mdx-js/react": "^3.1.0",
"clsx": "^2.1.1",
"llamaindex": "workspace:*",
"postcss": "^8.4.47",
"postcss": "^8.4.49",
"prism-react-renderer": "^2.4.0",
"raw-loader": "^4.0.2",
"react": "^18.3.1",
"react-dom": "18.3.1"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "3.6.0",
"@docusaurus/preset-classic": "3.6.0",
"@docusaurus/theme-classic": "3.6.0",
"@docusaurus/types": "3.6.0",
"@docusaurus/module-type-aliases": "3.6.1",
"@docusaurus/preset-classic": "3.6.1",
"@docusaurus/theme-classic": "3.6.1",
"@docusaurus/types": "3.6.1",
"@tsconfig/docusaurus": "2.0.3",
"@types/node": "^22.9.0",
"docusaurus-plugin-typedoc": "1.0.5",
+163
View File
@@ -1,5 +1,168 @@
# @llamaindex/doc
## 0.0.25
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
- @llamaindex/cloud@2.0.14
- @llamaindex/core@0.4.14
- @llamaindex/node-parser@0.0.15
- @llamaindex/openai@0.1.39
- @llamaindex/readers@1.0.16
## 0.0.24
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
## 0.0.23
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
## 0.0.22
### Patch Changes
- Updated dependencies [90d265c]
- @llamaindex/cloud@2.0.13
- @llamaindex/core@0.4.13
- llamaindex@0.8.19
- @llamaindex/node-parser@0.0.14
- @llamaindex/readers@1.0.15
- @llamaindex/openai@0.1.38
## 0.0.21
### Patch Changes
- Updated dependencies [d17450f]
- Updated dependencies [ef4f63d]
- llamaindex@0.8.18
- @llamaindex/core@0.4.12
- @llamaindex/cloud@2.0.12
- @llamaindex/node-parser@0.0.13
- @llamaindex/openai@0.1.37
- @llamaindex/readers@1.0.14
## 0.0.20
### Patch Changes
- Updated dependencies [6d22fa2]
- @llamaindex/core@0.4.11
- @llamaindex/cloud@2.0.11
- llamaindex@0.8.17
- @llamaindex/node-parser@0.0.12
- @llamaindex/openai@0.1.36
- @llamaindex/readers@1.0.13
## 0.0.19
### Patch Changes
- Updated dependencies [e60328b]
- @llamaindex/readers@1.0.12
- llamaindex@0.8.16
## 0.0.18
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
## 0.0.17
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
## 0.0.16
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [ee20c44]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
- @llamaindex/workflow@0.0.6
- llamaindex@0.8.13
- @llamaindex/cloud@2.0.10
- @llamaindex/node-parser@0.0.11
- @llamaindex/openai@0.1.35
- @llamaindex/readers@1.0.11
## 0.0.15
### Patch Changes
- Updated dependencies [ea92b69]
- Updated dependencies [fadc8b8]
- @llamaindex/workflow@0.0.5
## 0.0.14
### Patch Changes
- Updated dependencies [7ae6eaa]
- @llamaindex/core@0.4.9
- @llamaindex/openai@0.1.34
- @llamaindex/cloud@2.0.9
- llamaindex@0.8.12
- @llamaindex/node-parser@0.0.10
- @llamaindex/readers@1.0.10
## 0.0.13
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
- @llamaindex/cloud@2.0.8
- llamaindex@0.8.11
- @llamaindex/node-parser@0.0.9
- @llamaindex/openai@0.1.33
- @llamaindex/readers@1.0.9
## 0.0.12
### Patch Changes
- Updated dependencies [f066e50]
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- Updated dependencies [fd8c882]
- llamaindex@0.8.10
- @llamaindex/core@0.4.7
- @llamaindex/workflow@0.0.4
- @llamaindex/cloud@2.0.7
- @llamaindex/node-parser@0.0.8
- @llamaindex/openai@0.1.32
- @llamaindex/readers@1.0.8
## 0.0.11
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
- @llamaindex/cloud@2.0.6
- @llamaindex/core@0.4.6
- @llamaindex/node-parser@0.0.7
- @llamaindex/openai@0.1.31
- @llamaindex/readers@1.0.7
## 0.0.10
### Patch Changes
+2
View File
@@ -6,6 +6,7 @@ const withMDX = createMDX();
const config = {
reactStrictMode: true,
transpilePackages: ["monaco-editor"],
serverExternalPackages: ["@huggingface/transformers"],
webpack: (config, { isServer }) => {
if (Array.isArray(config.target) && config.target.includes("web")) {
config.target = ["web", "es2020"];
@@ -26,6 +27,7 @@ const config = {
}),
);
}
config.resolve.alias["replicate"] = false;
return config;
},
};
+24 -24
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/doc",
"version": "0.0.10",
"version": "0.0.25",
"private": true,
"scripts": {
"build": "pnpm run build:docs && next build",
@@ -12,7 +12,7 @@
},
"dependencies": {
"@icons-pack/react-simple-icons": "^10.1.0",
"@llamaindex/chat-ui": "0.0.5",
"@llamaindex/chat-ui": "0.0.9",
"@llamaindex/cloud": "workspace:*",
"@llamaindex/core": "workspace:*",
"@llamaindex/node-parser": "workspace:*",
@@ -20,31 +20,31 @@
"@llamaindex/readers": "workspace:*",
"@llamaindex/workflow": "workspace:*",
"@mdx-js/mdx": "^3.1.0",
"@number-flow/react": "^0.3.0",
"@number-flow/react": "^0.3.4",
"@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-icons": "^1.3.1",
"@radix-ui/react-icons": "^1.3.2",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-slider": "^1.2.1",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.3",
"@radix-ui/react-tooltip": "^1.1.4",
"@vercel/functions": "^1.5.0",
"ai": "^3.4.31",
"ai": "^3.4.33",
"class-variance-authority": "^0.7.0",
"clsx": "2.1.1",
"foxact": "^0.2.40",
"framer-motion": "^11.11.11",
"fumadocs-core": "14.2.0",
"fumadocs-docgen": "^1.3.1",
"foxact": "^0.2.41",
"framer-motion": "^11.11.17",
"fumadocs-core": "14.4.2",
"fumadocs-docgen": "^1.3.2",
"fumadocs-mdx": "^11.1.1",
"fumadocs-openapi": "^5.5.6",
"fumadocs-openapi": "^5.7.0",
"fumadocs-twoslash": "^2.0.1",
"fumadocs-typescript": "^3.0.1",
"fumadocs-ui": "14.2.0",
"fumadocs-typescript": "^3.0.2",
"fumadocs-ui": "14.4.2",
"hast-util-to-jsx-runtime": "^2.3.2",
"llamaindex": "workspace:*",
"lucide-react": "^0.454.0",
"next": "15.0.2",
"next-themes": "^0.3.0",
"lucide-react": "^0.460.0",
"next": "15.0.3",
"next-themes": "^0.4.3",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-icons": "^5.3.0",
@@ -54,19 +54,19 @@
"rehype-katex": "^7.0.1",
"remark-math": "^6.0.0",
"rimraf": "^6.0.1",
"shiki": "^1.22.2",
"shiki": "^1.23.1",
"shiki-magic-move": "^0.5.0",
"swr": "^2.2.5",
"tailwind-merge": "^2.5.2",
"tailwindcss-animate": "^1.0.7",
"tree-sitter": "^0.22.0",
"tree-sitter-typescript": "^0.23.0",
"use-stick-to-bottom": "^1.0.41",
"web-tree-sitter": "^0.24.3",
"tree-sitter": "^0.22.1",
"tree-sitter-typescript": "^0.23.2",
"use-stick-to-bottom": "^1.0.42",
"web-tree-sitter": "^0.24.4",
"zod": "^3.23.8"
},
"devDependencies": {
"@next/env": "^15.0.2",
"@next/env": "^15.0.3",
"@types/mdx": "^2.0.13",
"@types/node": "22.9.0",
"@types/react": "^18.3.12",
@@ -75,12 +75,12 @@
"fast-glob": "^3.3.2",
"gray-matter": "^4.0.3",
"monaco-editor-webpack-plugin": "^7.1.0",
"postcss": "^8.4.47",
"postcss": "^8.4.49",
"remark": "^15.0.1",
"remark-gfm": "^4.0.0",
"remark-mdx": "^3.1.0",
"remark-stringify": "^11.0.0",
"tailwindcss": "^3.4.14",
"tailwindcss": "^3.4.15",
"tsx": "^4.19.2",
"typescript": "^5.6.3"
}
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

+4 -1
View File
@@ -1,7 +1,10 @@
import { MockLLM } from "@llamaindex/core/utils";
import { LlamaIndexAdapter, type Message } from "ai";
import { SimpleChatEngine, type ChatMessage } from "llamaindex";
import { Settings, SimpleChatEngine, type ChatMessage } from "llamaindex";
import { NextResponse, type NextRequest } from "next/server";
Settings.llm = new MockLLM(); // config your LLM here
export async function POST(request: NextRequest) {
try {
const { messages } = (await request.json()) as { messages: Message[] };
-8
View File
@@ -1,8 +0,0 @@
"use client";
import { ChatSection } from "@llamaindex/chat-ui";
import { useChat } from "ai/react";
export const ChatDemo = () => {
const handler = useChat();
return <ChatSection handler={handler} />;
};
@@ -0,0 +1,16 @@
"use client";
import { ChatInput, ChatMessages, ChatSection } from "@llamaindex/chat-ui";
import { useChat } from "ai/react";
export const ChatDemo = () => {
const handler = useChat();
return (
<ChatSection handler={handler}>
<ChatMessages>
<ChatMessages.List className="h-auto max-h-[400px]" />
<ChatMessages.Actions />
</ChatMessages>
<ChatInput />
</ChatSection>
);
};
@@ -0,0 +1,57 @@
import { Markdown } from "@llamaindex/chat-ui/widgets";
import { MockLLM } from "@llamaindex/core/utils";
import { generateId, Message } from "ai";
import { createAI, createStreamableUI, getMutableAIState } from "ai/rsc";
import { type ChatMessage, Settings, SimpleChatEngine } from "llamaindex";
import { ReactNode } from "react";
type ServerState = Message[];
type FrontendState = Array<Message & { display: ReactNode }>;
type Actions = {
chat: (message: Message) => Promise<Message & { display: ReactNode }>;
};
Settings.llm = new MockLLM(); // config your LLM here
export const AI = createAI<ServerState, FrontendState, Actions>({
initialAIState: [],
initialUIState: [],
actions: {
chat: async (message: Message) => {
"use server";
const aiState = getMutableAIState<typeof AI>();
aiState.update((prev) => [...prev, message]);
const uiStream = createStreamableUI();
const chatEngine = new SimpleChatEngine();
const assistantMessage: Message = {
id: generateId(),
role: "assistant",
content: "",
};
// run the async function without blocking
(async () => {
const chatResponse = await chatEngine.chat({
stream: true,
message: message.content,
chatHistory: aiState.get() as ChatMessage[],
});
for await (const chunk of chatResponse) {
assistantMessage.content += chunk.delta;
uiStream.update(<Markdown content={assistantMessage.content} />);
}
aiState.done([...aiState.get(), assistantMessage]);
uiStream.done();
})();
return {
...assistantMessage,
display: uiStream.value,
};
},
},
});
@@ -0,0 +1,33 @@
"use client";
import {
ChatInput,
ChatMessage,
ChatMessages,
ChatSection as ChatSectionUI,
} from "@llamaindex/chat-ui";
import { useChatRSC } from "./use-chat-rsc";
export const ChatSectionRSC = () => {
const handler = useChatRSC();
return (
<ChatSectionUI handler={handler}>
<ChatMessages>
<ChatMessages.List className="h-auto max-h-[400px]">
{handler.messages.map((message, index) => (
<ChatMessage
key={index}
message={message}
isLast={index === handler.messages.length - 1}
>
<ChatMessage.Avatar />
<ChatMessage.Content>{message.display}</ChatMessage.Content>
</ChatMessage>
))}
<ChatMessages.Loading />
</ChatMessages.List>
</ChatMessages>
<ChatInput />
</ChatSectionUI>
);
};
@@ -0,0 +1,8 @@
import { AI } from "./ai-action";
import { ChatSectionRSC } from "./chat-section";
export const ChatDemoRSC = () => (
<AI>
<ChatSectionRSC />
</AI>
);
@@ -0,0 +1,41 @@
"use client";
import { useActions } from "ai/rsc";
import { generateId, Message } from "ai";
import { useUIState } from "ai/rsc";
import { useState } from "react";
import { AI } from "./ai-action";
export function useChatRSC() {
const [input, setInput] = useState<string>("");
const [isLoading, setIsLoading] = useState<boolean>(false);
const [messages, setMessages] = useUIState<typeof AI>();
const { chat } = useActions<typeof AI>();
const append = async (message: Omit<Message, "id">) => {
const newMsg: Message = { ...message, id: generateId() };
setIsLoading(true);
try {
setMessages((prev) => [...prev, { ...newMsg, display: message.content }]);
const assistantMsg = await chat(newMsg);
setMessages((prev) => [...prev, assistantMsg]);
} catch (error) {
console.error(error);
}
setIsLoading(false);
setInput("");
return message.content;
};
return {
input,
setInput,
isLoading,
messages,
setMessages,
append,
};
}
+27 -5
View File
@@ -85,6 +85,33 @@ const Footer = () => {
<Text as="span">SharePoint</Text>
</a>
</li>
<li>
<a
href="https://llamaindex.ai/llamacloud-aws-s3-data-loading-for-generative-ai"
data-tracking-variant="link"
data-tracking-section="footer"
>
<Text as="span">AWS S3</Text>
</a>
</li>
<li>
<a
href="https://llamaindex.ai/llamacloud-azure-blob-storage-data-loading-for-generative-ai"
data-tracking-variant="link"
data-tracking-section="footer"
>
<Text as="span">Azure Blob Storage</Text>
</a>
</li>
<li>
<a
href="https://llamaindex.ai/llamacloud-google-drive-data-loading-for-generative-ai"
data-tracking-variant="link"
data-tracking-section="footer"
>
<Text as="span">Google Drive</Text>
</a>
</li>
</ul>
</div>
<div>
@@ -171,11 +198,6 @@ const Footer = () => {
<Text as="span">SEC Insights</Text>
</a>
</li>
<li>
<a href="https://chat.llamaindex.ai/">
<Text as="span">Chat LlamaIndex</Text>
</a>
</li>
<li>
<a href="https://github.com/run-llama/llamabot">
<Text as="span">LlamaBot</Text>
@@ -1,8 +1,8 @@
---
title: Chat-UI
description: Use chat-ui to add a chat interface to your LlamaIndexTS application.
title: Using API Route
description: Chat interface for your LlamaIndexTS application using API Route
---
import { ChatDemo } from '../../../../components/demo/chat';
import { ChatDemo } from '../../../../../components/demo/chat/api/demo';
import "@llamaindex/chat-ui/styles/code.css";
import "@llamaindex/chat-ui/styles/katex.css";
@@ -26,7 +26,7 @@ This is the simplest way to add a chat interface to your application. Copy the f
```json doc-gen:file
{
"file": "./src/components/demo/chat.tsx",
"file": "./src/components/demo/chat/api/demo.tsx",
"codeblock": true
}
```
@@ -37,6 +37,7 @@ Combining both, you're getting a fully functional chat interface:
<ChatDemo />
## Next Steps
The steps above are the bare minimum to get a chat interface working. From here, you can go two ways:
@@ -0,0 +1,6 @@
{
"title": "Chat-UI",
"description": "Use chat-ui to add a chat interface to your LlamaIndexTS application.",
"defaultOpen": false,
"pages": ["chat", "rsc"]
}
@@ -0,0 +1,68 @@
---
title: Using Next.js RSC
description: Chat interface for your LlamaIndexTS application using Next.js RSC
---
import { ChatDemoRSC } from '../../../../../components/demo/chat/rsc/demo';
import "@llamaindex/chat-ui/styles/code.css";
import "@llamaindex/chat-ui/styles/katex.css";
Using [chat-ui](https://github.com/run-llama/chat-ui), it's easy to add a chat interface to your LlamaIndexTS application using [Next.js RSC](https://nextjs.org/docs/app/building-your-application/rendering/server-components) and [Vercel AI RSC](https://sdk.vercel.ai/docs/ai-sdk-rsc/overview).
With RSC, the chat messages are not returned as JSON from the server (like when using an [API route](./chat)), instead the chat message components are rendered on the server side.
This is for example useful for rendering a whole chat history on the server before sending it to the client. [Check here](https://sdk.vercel.ai/docs/getting-started/navigating-the-library#when-to-use-ai-sdk-rsc), for a discussion of when to use use RSC.
For implementing a chat interface with RSC, you need to create an AI action and then connect the chat interface to use it.
## Create an AI action
First, define an [AI context provider](https://sdk.vercel.ai/examples/rsc/state-management/ai-ui-states) with a chat server action:
```json doc-gen:file
{
"file": "./src/components/demo/chat/rsc/ai-action.tsx",
"codeblock": true
}
```
The chat server action is using LlamaIndexTS to generate a response based on the chat history and the user input.
## Create the chat UI
The entrypoint of our application initializes the AI provider for the application and adds a `ChatSection` component:
```json doc-gen:file
{
"file": "./src/components/demo/chat/rsc/demo.tsx",
"codeblock": true
}
```
The `ChatSection` component is created by using chat components from @llamaindex/chat-ui:
```json doc-gen:file
{
"file": "./src/components/demo/chat/rsc/chat-section.tsx",
"codeblock": true
}
```
It is using a `useChatRSC` hook to conntect the chat interface to the `chat` AI action that we defined earlier:
```json doc-gen:file
{
"file": "./src/components/demo/chat/rsc/use-chat-rsc.tsx",
"codeblock": true
}
```
## Try RSC Chat ⬇️
<ChatDemoRSC />
## Next Steps
The steps above are the bare minimum to get a chat interface working with RSC. From here, you can go two ways:
1. Use our [full-stack RSC example](https://github.com/run-llama/nextjs-rsc) based on [create-llama](https://github.com/run-llama/create-llama) to get started quickly with a fully working chat interface or
2. Learn more about [AI RSC](https://sdk.vercel.ai/examples/rsc), [chat-ui](https://github.com/run-llama/chat-ui) and [LlamaIndexTS](https://github.com/run-llama/llamaindex-ts) to customize the chat interface and AI actions to your needs.
@@ -37,6 +37,33 @@ Then, you need create `.dev.vars` and add LLM api keys for the local development
<Callout type="warn">Do not commit the api key to git repository.</Callout>
## Integrating with Hono
```ts
import { Hono } from "hono";
type Bindings = {
OPENAI_API_KEY: string;
};
const app = new Hono<{
Bindings: Bindings;
}>();
app.post("/llm", async (c) => {
const { setEnvs } = await import("@llamaindex/env");
setEnvs(c.env);
// ...
return new Response('Hello, world!');
})
export default {
fetch: app.fetch,
};
```
## Difference between Node.js and Cloudflare Worker
In Cloudflare Worker and similar serverless JS environment, you need to be aware of the following differences:
@@ -46,3 +73,7 @@ In Cloudflare Worker and similar serverless JS environment, you need to be aware
- Some of LlamaIndex.TS modules are not available in Cloudflare Worker, for example `SimpleDirectoryReader` (requires `node:fs`), Some multimodal API that relies on [`onnxruntime-node`](https://www.npmjs.com/package/onnxruntime-node)(we might port to HTTP based module in the future).
- `@llamaindex/core` is designed to work in all JavaScript environment, including Cloudflare Worker. If you find any issue, please report to us.
- `@llamaindex/env` is a JS environment binding module, which polyfill some Node.js/Modern Web API (for example, we have a memory based `fs` module, and Crypto API polyfill). It is designed to work in all JavaScript environment, including Cloudflare Worker.
## Known issues
- `llamaindex` not work perfectly in Cloudflare Worker, bundle size will be larger than 1MB, which is the limit of Cloudflare Worker. You will need import submodule instead of the whole `llamaindex` module.
+8
View File
@@ -1,6 +1,14 @@
{
"extends": ["//"],
"tasks": {
"build": {
"outputs": [
".next",
".source",
"next-env.d.ts",
"src/content/docs/cloud/api/**"
]
},
"dev": {
"dependsOn": ["^build"]
}
+3
View File
@@ -1 +1,4 @@
POSTGRES_USER=runner
PINECONE_API_KEY=
PINECONE_INDEX_NAME=
PINECONE_NAMESPACE=
+172
View File
@@ -0,0 +1,172 @@
# Logs
logs
_.log
npm-debug.log_
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
# Runtime data
pids
_.pid
_.seed
\*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
\*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
\*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
\*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.\*
# wrangler project
.dev.vars
.wrangler/
+20
View File
@@ -0,0 +1,20 @@
{
"name": "@llamaindex/cloudflare-hono",
"version": "0.0.0",
"private": true,
"scripts": {
"deploy": "wrangler deploy",
"build": "wrangler deploy --dry-run --outdir dist",
"dev": "wrangler dev",
"start": "wrangler dev",
"cf-typegen": "wrangler types"
},
"devDependencies": {
"@cloudflare/workers-types": "^4.20241112.0",
"typescript": "^5.5.2",
"wrangler": "^3.89.0"
},
"dependencies": {
"hono": "^4.6.11"
}
}
+91
View File
@@ -0,0 +1,91 @@
import { Hono } from "hono";
type Bindings = {
OPENAI_API_KEY: string;
PINECONE_API_KEY: string;
};
const app = new Hono<{
Bindings: Bindings;
}>();
app.post("/llm", async (c) => {
//#region init envs
const { setEnvs } = await import("@llamaindex/env");
setEnvs(c.env);
//#endregion
const { message } = await c.req.json();
const { extractText } = await import("@llamaindex/core/utils");
const {
QueryEngineTool,
serviceContextFromDefaults,
VectorStoreIndex,
OpenAIAgent,
Settings,
OpenAI,
OpenAIEmbedding,
} = await import("llamaindex");
const { PineconeVectorStore } = await import(
"llamaindex/vector-store/PineconeVectorStore"
);
const llm = new OpenAI({
model: "gpt-4o-mini",
apiKey: c.env.OPENAI_API_KEY,
});
Settings.embedModel = new OpenAIEmbedding({
model: "text-embedding-3-small",
apiKey: c.env.OPENAI_API_KEY,
});
const serviceContext = serviceContextFromDefaults({
llm,
chunkSize: 8191,
chunkOverlap: 0,
});
const store = new PineconeVectorStore({
namespace: "8xolsn4ulEQGdhnhP76yCzfLHdOZ",
});
const index = await VectorStoreIndex.fromVectorStore(store, serviceContext);
const retriever = index.asRetriever({
similarityTopK: 3,
});
// Create a query engine
const queryEngine = index.asQueryEngine({
retriever,
});
const tools = [
new QueryEngineTool({
queryEngine: queryEngine,
metadata: {
name: "business_info_tool",
description:
"This tool can answer questions based " +
"on business information. Return not found if you" +
" can't find the answer in the documents.",
},
}),
];
const agent = new OpenAIAgent({ tools });
const response = await agent.chat({
message: message,
});
return new Response(extractText(response.message.content));
});
export default {
fetch: app.fetch,
};
@@ -0,0 +1,39 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */
/* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
"target": "es2021",
/* Specify a set of bundled library declaration files that describe the target runtime environment. */
"lib": ["es2021", "DOM.AsyncIterable"],
/* Specify what JSX code is generated. */
"jsx": "react-jsx",
/* Specify what module code is generated. */
"module": "es2022",
/* Specify how TypeScript looks up a file from a given module specifier. */
"moduleResolution": "Bundler",
/* Specify type package names to be included without being referenced in a source file. */
"types": ["@cloudflare/workers-types/2023-07-01"],
/* Enable importing .json files */
"resolveJsonModule": true,
/* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
"allowJs": true,
/* Enable error reporting in type-checked JavaScript files. */
"checkJs": false,
/* Disable emitting files from a compilation. */
"noEmit": true,
/* Ensure that each file can be safely transpiled without relying on other imports. */
"isolatedModules": true,
/* Allow 'import x from y' when a module doesn't have a default export. */
"allowSyntheticDefaultImports": true,
/* Ensure that casing is correct in imports. */
"forceConsistentCasingInFileNames": true,
/* Enable all strict type-checking options. */
"strict": true,
/* Skip type checking all .d.ts files. */
"skipLibCheck": true
},
"exclude": ["test"],
"include": ["vitest.config.mts", "worker-configuration.d.ts", "src/**/*.ts"]
}
@@ -0,0 +1,4 @@
// Generated by Wrangler by running `wrangler types`
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
interface Env {}
@@ -0,0 +1,7 @@
name = "llamaindex-cloudflare-hono-example"
main = "src/index.ts"
compatibility_date = "2024-11-12"
compatibility_flags = ["nodejs_als"]
[observability]
enabled = true
@@ -1,5 +1,101 @@
# @llamaindex/cloudflare-worker-agent-test
## 0.0.118
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
## 0.0.117
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
## 0.0.116
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
## 0.0.115
### Patch Changes
- Updated dependencies [90d265c]
- llamaindex@0.8.19
## 0.0.114
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
## 0.0.113
### Patch Changes
- llamaindex@0.8.17
## 0.0.112
### Patch Changes
- llamaindex@0.8.16
## 0.0.111
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
## 0.0.110
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
## 0.0.109
### Patch Changes
- llamaindex@0.8.13
## 0.0.108
### Patch Changes
- llamaindex@0.8.12
## 0.0.107
### Patch Changes
- llamaindex@0.8.11
## 0.0.106
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.0.105
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 0.0.104
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/cloudflare-worker-agent-test",
"version": "0.0.104",
"version": "0.0.118",
"type": "module",
"private": true,
"scripts": {
@@ -12,13 +12,13 @@
"cf-typegen": "wrangler types"
},
"devDependencies": {
"@cloudflare/vitest-pool-workers": "^0.5.8",
"@cloudflare/workers-types": "^4.20240924.0",
"@vitest/runner": "2.1.4",
"@vitest/snapshot": "2.1.4",
"@cloudflare/vitest-pool-workers": "^0.5.28",
"@cloudflare/workers-types": "^4.20241112.0",
"@vitest/runner": "2.1.5",
"@vitest/snapshot": "2.1.5",
"typescript": "^5.6.3",
"vitest": "2.1.4",
"wrangler": "^3.78.8"
"vitest": "2.1.5",
"wrangler": "^3.87.0"
},
"dependencies": {
"llamaindex": "workspace:*"
@@ -1,5 +1,60 @@
# @llamaindex/llama-parse-browser-test
## 0.0.34
### Patch Changes
- @llamaindex/cloud@2.0.14
## 0.0.33
### Patch Changes
- Updated dependencies [90d265c]
- @llamaindex/cloud@2.0.13
## 0.0.32
### Patch Changes
- @llamaindex/cloud@2.0.12
## 0.0.31
### Patch Changes
- @llamaindex/cloud@2.0.11
## 0.0.30
### Patch Changes
- @llamaindex/cloud@2.0.10
## 0.0.29
### Patch Changes
- @llamaindex/cloud@2.0.9
## 0.0.28
### Patch Changes
- @llamaindex/cloud@2.0.8
## 0.0.27
### Patch Changes
- @llamaindex/cloud@2.0.7
## 0.0.26
### Patch Changes
- @llamaindex/cloud@2.0.6
## 0.0.25
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/llama-parse-browser-test",
"private": true,
"version": "0.0.25",
"version": "0.0.34",
"type": "module",
"scripts": {
"dev": "vite",
@@ -10,7 +10,7 @@
},
"devDependencies": {
"typescript": "^5.6.3",
"vite": "^5.4.1",
"vite": "^5.4.11",
"vite-plugin-wasm": "^3.3.0"
},
"dependencies": {
+96
View File
@@ -1,5 +1,101 @@
# @llamaindex/next-agent-test
## 0.1.118
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
## 0.1.117
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
## 0.1.116
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
## 0.1.115
### Patch Changes
- Updated dependencies [90d265c]
- llamaindex@0.8.19
## 0.1.114
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
## 0.1.113
### Patch Changes
- llamaindex@0.8.17
## 0.1.112
### Patch Changes
- llamaindex@0.8.16
## 0.1.111
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
## 0.1.110
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
## 0.1.109
### Patch Changes
- llamaindex@0.8.13
## 0.1.108
### Patch Changes
- llamaindex@0.8.12
## 0.1.107
### Patch Changes
- llamaindex@0.8.11
## 0.1.106
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.1.105
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 0.1.104
### Patch Changes
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-agent-test",
"version": "0.1.104",
"version": "0.1.118",
"private": true,
"scripts": {
"dev": "next dev",
@@ -8,9 +8,9 @@
"start": "next start"
},
"dependencies": {
"ai": "^3.3.21",
"ai": "^4.0.0",
"llamaindex": "workspace:*",
"next": "15.0.2",
"next": "15.0.3",
"react": "18.3.1",
"react-dom": "18.3.1"
},
@@ -18,10 +18,10 @@
"@types/node": "^22.9.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"eslint": "9.14.0",
"eslint-config-next": "15.0.2",
"postcss": "^8.4.41",
"tailwindcss": "^3.4.10",
"eslint": "9.15.0",
"eslint-config-next": "15.0.3",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.15",
"typescript": "^5.6.3"
}
}
@@ -1,5 +1,101 @@
# test-edge-runtime
## 0.1.117
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
## 0.1.116
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
## 0.1.115
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
## 0.1.114
### Patch Changes
- Updated dependencies [90d265c]
- llamaindex@0.8.19
## 0.1.113
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
## 0.1.112
### Patch Changes
- llamaindex@0.8.17
## 0.1.111
### Patch Changes
- llamaindex@0.8.16
## 0.1.110
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
## 0.1.109
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
## 0.1.108
### Patch Changes
- llamaindex@0.8.13
## 0.1.107
### Patch Changes
- llamaindex@0.8.12
## 0.1.106
### Patch Changes
- llamaindex@0.8.11
## 0.1.105
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.1.104
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 0.1.103
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/nextjs-edge-runtime-test",
"version": "0.1.103",
"version": "0.1.117",
"private": true,
"scripts": {
"dev": "next dev",
@@ -9,7 +9,7 @@
},
"dependencies": {
"llamaindex": "workspace:*",
"next": "15.0.2",
"next": "15.0.3",
"react": "^18.3.1",
"react-dom": "^18.3.1"
},
@@ -1,5 +1,101 @@
# @llamaindex/next-node-runtime
## 0.0.99
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
## 0.0.98
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
## 0.0.97
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
## 0.0.96
### Patch Changes
- Updated dependencies [90d265c]
- llamaindex@0.8.19
## 0.0.95
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
## 0.0.94
### Patch Changes
- llamaindex@0.8.17
## 0.0.93
### Patch Changes
- llamaindex@0.8.16
## 0.0.92
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
## 0.0.91
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
## 0.0.90
### Patch Changes
- llamaindex@0.8.13
## 0.0.89
### Patch Changes
- llamaindex@0.8.12
## 0.0.88
### Patch Changes
- llamaindex@0.8.11
## 0.0.87
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.0.86
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 0.0.85
### Patch Changes
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/next-node-runtime-test",
"version": "0.0.85",
"version": "0.0.99",
"private": true,
"scripts": {
"dev": "next dev",
@@ -9,7 +9,7 @@
},
"dependencies": {
"llamaindex": "workspace:*",
"next": "15.0.2",
"next": "15.0.3",
"react": "18.3.1",
"react-dom": "18.3.1"
},
@@ -17,10 +17,10 @@
"@types/node": "^22.9.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"eslint": "9.14.0",
"eslint-config-next": "15.0.2",
"postcss": "^8.4.41",
"tailwindcss": "^3.4.10",
"eslint": "9.15.0",
"eslint-config-next": "15.0.3",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.15",
"typescript": "^5.6.3"
}
}
@@ -15,7 +15,6 @@ Settings.llm = new OpenAI({
});
Settings.embedModel = new HuggingFaceEmbedding({
modelType: "BAAI/bge-small-en-v1.5",
quantized: false,
});
Settings.callbackManager.on("llm-tool-call", (event) => {
console.log(event.detail);
@@ -1,5 +1,101 @@
# @llamaindex/waku-query-engine-test
## 0.0.118
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
## 0.0.117
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
## 0.0.116
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
## 0.0.115
### Patch Changes
- Updated dependencies [90d265c]
- llamaindex@0.8.19
## 0.0.114
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
## 0.0.113
### Patch Changes
- llamaindex@0.8.17
## 0.0.112
### Patch Changes
- llamaindex@0.8.16
## 0.0.111
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
## 0.0.110
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
## 0.0.109
### Patch Changes
- llamaindex@0.8.13
## 0.0.108
### Patch Changes
- llamaindex@0.8.12
## 0.0.107
### Patch Changes
- llamaindex@0.8.11
## 0.0.106
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.0.105
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 0.0.104
### Patch Changes
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/waku-query-engine-test",
"version": "0.0.104",
"version": "0.0.118",
"type": "module",
"private": true,
"scripts": {
@@ -10,16 +10,16 @@
},
"dependencies": {
"llamaindex": "workspace:*",
"react": "19.0.0-rc-bf7e210c-20241017",
"react-dom": "19.0.0-rc-bf7e210c-20241017",
"react-server-dom-webpack": "19.0.0-rc-bf7e210c-20241017",
"waku": "0.21.4"
"react": "19.0.0-rc-5c56b873-20241107",
"react-dom": "19.0.0-rc-5c56b873-20241107",
"react-server-dom-webpack": "19.0.0-rc-5c56b873-20241107",
"waku": "0.21.6"
},
"devDependencies": {
"@types/react": "18.3.12",
"@types/react-dom": "18.3.1",
"autoprefixer": "^10.4.20",
"tailwindcss": "^3.4.14",
"tailwindcss": "^3.4.15",
"typescript": "5.6.3"
}
}
+3
View File
@@ -0,0 +1,3 @@
import { OpenAI } from "./openai.js";
export class Ollama extends OpenAI {}
+11 -1
View File
@@ -15,7 +15,17 @@ export async function resolve(specifier, context, nextResolve) {
const targetUrl = fileURLToPath(result.url).replace(/\.js$/, ".ts");
let relativePath = relative(packageDistDir, targetUrl);
// todo: make it more generic if we have more sub modules fixtures in the future
if (relativePath.startsWith("../../llm/openai")) {
if (relativePath.startsWith("../../llm/anthropic")) {
relativePath = relativePath.replace(
"../../llm/ollama/dist/index.ts",
"llm/anthropic.ts",
);
} else if (relativePath.startsWith("../../llm/ollama")) {
relativePath = relativePath.replace(
"../../llm/ollama/dist/index.ts",
"llm/ollama.ts",
);
} else if (relativePath.startsWith("../../llm/openai")) {
relativePath = relativePath.replace(
"../../llm/openai/dist/index.ts",
"llm/openai.ts",
+1 -1
View File
@@ -64,7 +64,7 @@ await test("clip embedding", async (t) => {
});
await t.test("custom transformer", async () => {
const transformers = await import("@xenova/transformers");
const transformers = await import("@huggingface/transformers");
const getter = test.mock.fn((t, k, r) => {
return Reflect.get(t, k, r);
});
+35
View File
@@ -0,0 +1,35 @@
import { Ollama } from "@llamaindex/ollama";
import assert from "node:assert";
import { test } from "node:test";
import { getWeatherTool } from "./fixtures/tools.js";
import { mockLLMEvent } from "./utils.js";
await test("ollama", async (t) => {
await mockLLMEvent(t, "ollama");
await t.test("ollama function call", async (t) => {
const llm = new Ollama({
model: "llama3.2",
});
const chatResponse = await llm.chat({
messages: [
{
role: "user",
content: "What is the weather in Paris?",
},
],
tools: [getWeatherTool],
});
if (
chatResponse.message.options &&
"toolCall" in chatResponse.message.options
) {
assert.equal(chatResponse.message.options.toolCall.length, 1);
assert.equal(
chatResponse.message.options.toolCall[0]!.name,
getWeatherTool.metadata.name,
);
} else {
throw new Error("Expected tool calls in response");
}
});
});
+1
View File
@@ -167,6 +167,7 @@ For questions about more specific sections, please use the vector_tool.`,
const mockCall = t.mock.fn(({ query }: { query: string }) => {
return originalCall({ query });
});
// @ts-expect-error what?
queryEngineTools[1]!.call = mockCall;
const toolMapping = SimpleToolNodeMapping.fromObjects(queryEngineTools);
+37
View File
@@ -0,0 +1,37 @@
{
"llmEventStart": [
{
"id": "PRESERVE_0",
"messages": [
{
"role": "user",
"content": "What is the weather in Paris?"
}
]
}
],
"llmEventEnd": [
{
"id": "PRESERVE_0",
"response": {
"message": {
"role": "assistant",
"content": "",
"options": {
"toolCall": [
{
"name": "getWeather",
"input": {
"city": "Paris"
},
"id": "5d198775-5268-4552-993b-9ecb4425385b"
}
]
}
},
"raw": null
}
}
],
"llmEventStream": []
}
+66
View File
@@ -0,0 +1,66 @@
import { Document, MetadataMode } from "@llamaindex/core/schema";
import { config } from "dotenv";
import {
OpenAIEmbedding,
PineconeVectorStore,
VectorStoreIndex,
} from "llamaindex";
import assert from "node:assert";
import { test } from "node:test";
config({ path: [".env.local", ".env", ".env.ci"] });
await test("pinecone", async (t) => {
if (
!process.env.PINECONE_API_KEY ||
!process.env.PINECONE_NAMESPACE ||
!process.env.PINECONE_INDEX_NAME
) {
return t.skip(
"PINECONE_API_KEY, PINECONE_NAMESPACE, and PINECONE_INDEX_NAME must be set to run this test",
);
}
const openaiEmbedding = new OpenAIEmbedding({
model: "text-embedding-3-large",
});
const vectorStore = new PineconeVectorStore({
embeddingModel: openaiEmbedding,
});
t.after(async () => {
await vectorStore.clearIndex();
});
const index = await VectorStoreIndex.fromVectorStore(vectorStore);
const retriever = index.asRetriever({
similarityTopK: 3,
});
const text = "We are open from 9am to 5pm";
await vectorStore.add([
new Document({
text,
embedding: await openaiEmbedding.getTextEmbedding(text),
}),
]);
const results = await retriever.retrieve({
query: "When are you open?",
});
results.every((result) => {
assert.ok(result.node.embedding instanceof Array);
result.node.embedding.every((embedding, idx) =>
assert.ok(
typeof embedding === "number",
`Embedding at index ${idx} should be a number`,
),
);
assert.ok(typeof result.score === "number", "Score should be a number");
assert.ok(
result.node.getContent(MetadataMode.NONE).length > 0,
"Content should not be empty",
);
});
});
+2 -1
View File
@@ -12,10 +12,11 @@
"@faker-js/faker": "^9.2.0",
"@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*",
"@llamaindex/ollama": "workspace:*",
"@llamaindex/openai": "workspace:*",
"@types/node": "^22.9.0",
"@types/pg": "^8.11.8",
"@xenova/transformers": "^2.17.2",
"@huggingface/transformers": "^3.0.2",
"consola": "^3.2.3",
"dotenv": "^16.4.5",
"llamaindex": "workspace:*",
+33
View File
@@ -1,5 +1,38 @@
# examples
## 0.0.16
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [ee20c44]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
- @llamaindex/workflow@0.0.6
- llamaindex@0.8.13
- @llamaindex/readers@1.0.11
## 0.0.15
### Patch Changes
- Updated dependencies [ea92b69]
- Updated dependencies [fadc8b8]
- @llamaindex/workflow@0.0.5
## 0.0.14
### Patch Changes
- Updated dependencies [f066e50]
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- Updated dependencies [fd8c882]
- llamaindex@0.8.10
- @llamaindex/core@0.4.7
- @llamaindex/workflow@0.0.4
- @llamaindex/readers@1.0.8
## 0.0.13
### Patch Changes
+38
View File
@@ -0,0 +1,38 @@
import { Anthropic } from "llamaindex";
async function main() {
const anthropic = new Anthropic({
model: "claude-3-5-sonnet-20241022",
});
const entireBook = await fetch(
"https://www.gutenberg.org/files/1342/1342-0.txt",
).then((response) => response.text());
const response = await anthropic.chat({
messages: [
{
content:
"You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n",
role: "system",
},
{
content: entireBook,
role: "system",
options: {
cache_control: {
type: "ephemeral",
},
},
},
{
content: "analyze the major themes in Pride and Prejudice.",
role: "user",
},
],
});
console.log(response.message.content);
}
main().catch(console.error);
-8
View File
@@ -83,14 +83,6 @@ async function query() {
});
}
// configure the Azure CosmosDB NoSQL Vector Store
const dbConfig: AzureCosmosDBNoSQLConfig = {
client: cosmosClient,
databaseName,
containerName,
flatMetadata: false,
};
// use Azure CosmosDB as a vectorStore, docStore, and indexStore
const { vectorStore, docStore, indexStore } = await initializeStores();
+6 -6
View File
@@ -1,24 +1,24 @@
{
"name": "@llamaindex/examples",
"private": true,
"version": "0.0.13",
"version": "0.0.16",
"dependencies": {
"@aws-crypto/sha256-js": "^5.2.0",
"@azure/cosmos": "^4.1.1",
"@azure/identity": "^4.4.1",
"@datastax/astra-db-ts": "^1.4.1",
"@llamaindex/core": "^0.4.5",
"@llamaindex/readers": "^1.0.6",
"@llamaindex/workflow": "^0.0.3",
"@llamaindex/core": "^0.4.10",
"@llamaindex/readers": "^1.0.11",
"@llamaindex/workflow": "^0.0.6",
"@notionhq/client": "^2.2.15",
"@pinecone-database/pinecone": "^3.0.2",
"@pinecone-database/pinecone": "^4.0.0",
"@vercel/postgres": "^0.10.0",
"@zilliz/milvus2-sdk-node": "^2.4.6",
"chromadb": "^1.8.1",
"commander": "^12.1.0",
"dotenv": "^16.4.5",
"js-tiktoken": "^1.0.14",
"llamaindex": "^0.8.8",
"llamaindex": "^0.8.13",
"mongodb": "^6.7.0",
"pathe": "^1.1.2",
"postgres": "^3.4.4"
-1
View File
@@ -14,7 +14,6 @@ Settings.llm = new Ollama({
Settings.embedModel = new HuggingFaceEmbedding({
modelType: "BAAI/bge-small-en-v1.5",
quantized: false,
});
async function main() {
+16
View File
@@ -0,0 +1,16 @@
import { VLLM } from "llamaindex";
const llm = new VLLM({
model: "NousResearch/Meta-Llama-3-8B-Instruct",
});
const response = await llm.chat({
messages: [
{
role: "user",
content: "Hello?",
},
],
});
console.log(response.message.content);
+65 -30
View File
@@ -1,14 +1,19 @@
import {
Context,
HandlerContext,
StartEvent,
StopEvent,
Workflow,
WorkflowEvent,
} from "@llamaindex/core/workflow";
} from "@llamaindex/workflow";
import { OpenAI } from "llamaindex";
const MAX_REVIEWS = 3;
type Context = {
specification: string;
numberReviews: number;
};
// Using the o1-preview model (see https://platform.openai.com/docs/guides/reasoning?reasoning-prompt-examples=coding-planning)
const llm = new OpenAI({ model: "o1-preview", temperature: 1 });
@@ -20,7 +25,9 @@ stores the question/answer pair in the database.`;
// Create custom event types
export class MessageEvent extends WorkflowEvent<{ msg: string }> {}
export class CodeEvent extends WorkflowEvent<{ code: string }> {}
export class ReviewEvent extends WorkflowEvent<{
review: string;
code: string;
@@ -34,12 +41,13 @@ const truncate = (str: string) => {
};
// the architect is responsible for writing the structure and the initial code based on the specification
const architect = async (context: Context, ev: StartEvent) => {
// get the specification from the start event and save it to context
context.set("specification", ev.data.input);
const spec = context.get("specification");
const architect = async (
context: HandlerContext<Context>,
_: StartEvent<string>,
) => {
const spec = context.data.specification;
// write a message to send an update to the user
context.writeEventToStream(
context.sendEvent(
new MessageEvent({
msg: `Writing app using this specification: ${truncate(spec)}`,
}),
@@ -50,13 +58,13 @@ const architect = async (context: Context, ev: StartEvent) => {
};
// the coder is responsible for updating the code based on the review
const coder = async (context: Context, ev: ReviewEvent) => {
const coder = async (context: HandlerContext<Context>, ev: ReviewEvent) => {
// get the specification from the context
const spec = context.get("specification");
const spec = context.data.specification;
// get the latest review and code
const { review, code } = ev.data;
// write a message to send an update to the user
context.writeEventToStream(
context.sendEvent(
new MessageEvent({
msg: `Update code based on review: ${truncate(review)}`,
}),
@@ -67,32 +75,35 @@ const coder = async (context: Context, ev: ReviewEvent) => {
};
// the reviewer is responsible for reviewing the code and providing feedback
const reviewer = async (context: Context, ev: CodeEvent) => {
const reviewer = async (context: HandlerContext<Context>, ev: CodeEvent) => {
// get the specification from the context
const spec = context.get("specification");
const spec = context.data.specification;
// get latest code from the event
const { code } = ev.data;
// update and check the number of reviews
const numberReviews = context.get("numberReviews", 0) + 1;
context.set("numberReviews", numberReviews);
if (numberReviews > MAX_REVIEWS) {
context.data.numberReviews++;
if (context.data.numberReviews > MAX_REVIEWS) {
// the we've done this too many times - return the code
context.writeEventToStream(
context.sendEvent(
new MessageEvent({
msg: `Already reviewed ${numberReviews - 1} times, stopping!`,
msg: `Already reviewed ${
context.data.numberReviews - 1
} times, stopping!`,
}),
);
return new StopEvent({ result: code });
}
// write a message to send an update to the user
context.writeEventToStream(
new MessageEvent({ msg: `Review #${numberReviews}: ${truncate(code)}` }),
context.sendEvent(
new MessageEvent({
msg: `Review #${context.data.numberReviews}: ${truncate(code)}`,
}),
);
const prompt = `Review this code: <code>${code}</code>. Check if the code quality and whether it correctly implements this specification: <spec>${spec}</spec>. If you're satisfied, just return 'Looks great', nothing else. If not, return a review with a list of changes you'd like to see.`;
const review = (await llm.complete({ prompt })).text;
if (review.includes("Looks great")) {
// the reviewer is satisfied with the code, let's return the review
context.writeEventToStream(
context.sendEvent(
new MessageEvent({
msg: `Reviewer says: ${review}`,
}),
@@ -103,20 +114,44 @@ const reviewer = async (context: Context, ev: CodeEvent) => {
return new ReviewEvent({ review, code });
};
const codeAgent = new Workflow({ validate: true });
codeAgent.addStep(StartEvent, architect, { outputs: CodeEvent });
codeAgent.addStep(ReviewEvent, coder, { outputs: CodeEvent });
codeAgent.addStep(CodeEvent, reviewer, { outputs: ReviewEvent });
const codeAgent = new Workflow<Context, string, string>();
codeAgent.addStep(
{
inputs: [StartEvent<string>],
outputs: [CodeEvent],
},
architect,
);
codeAgent.addStep(
{
inputs: [ReviewEvent],
outputs: [CodeEvent],
},
coder,
);
codeAgent.addStep(
{
inputs: [CodeEvent],
outputs: [ReviewEvent, StopEvent],
},
reviewer,
);
// Usage
async function main() {
const run = codeAgent.run(specification);
for await (const event of codeAgent.streamEvents()) {
const msg = (event as MessageEvent).data.msg;
console.log(`${msg}\n`);
const run = codeAgent.run(specification).with({
specification,
numberReviews: 0,
});
for await (const event of run) {
if (event instanceof MessageEvent) {
const msg = (event as MessageEvent).data.msg;
console.log(`${msg}\n`);
} else if (event instanceof StopEvent) {
const result = (event as StopEvent<string>).data;
console.log("Final code:\n", result);
}
}
const result = await run;
console.log("Final code:\n", result.data.result);
}
main().catch(console.error);
@@ -1,10 +1,10 @@
import {
Context,
HandlerContext,
StartEvent,
StopEvent,
Workflow,
WorkflowEvent,
} from "@llamaindex/core/workflow";
} from "@llamaindex/workflow";
import { OpenAI } from "llamaindex";
// Create LLM instance
@@ -12,59 +12,77 @@ const llm = new OpenAI();
// Create custom event types
export class JokeEvent extends WorkflowEvent<{ joke: string }> {}
export class CritiqueEvent extends WorkflowEvent<{ critique: string }> {}
export class AnalysisEvent extends WorkflowEvent<{ analysis: string }> {}
const generateJoke = async (_context: Context, ev: StartEvent) => {
const prompt = `Write your best joke about ${ev.data.input}.`;
const generateJoke = async (_: unknown, ev: StartEvent<string>) => {
const prompt = `Write your best joke about ${ev.data}.`;
const response = await llm.complete({ prompt });
return new JokeEvent({ joke: response.text });
};
const critiqueJoke = async (_context: Context, ev: JokeEvent) => {
const critiqueJoke = async (_: unknown, ev: JokeEvent) => {
const prompt = `Give a thorough critique of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt });
return new CritiqueEvent({ critique: response.text });
};
const analyzeJoke = async (_context: Context, ev: JokeEvent) => {
const analyzeJoke = async (_: unknown, ev: JokeEvent) => {
const prompt = `Give a thorough analysis of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt });
return new AnalysisEvent({ analysis: response.text });
};
const reportJoke = async (
context: Context,
ev: AnalysisEvent | CritiqueEvent,
context: HandlerContext,
ev1: AnalysisEvent,
ev2: CritiqueEvent,
) => {
const events = context.collectEvents(ev, [AnalysisEvent, CritiqueEvent]);
if (!events) {
return;
}
const subPrompts = events.map((event) => {
if (event instanceof AnalysisEvent) {
return `Analysis: ${event.data.analysis}`;
} else if (event instanceof CritiqueEvent) {
return `Critique: ${event.data.critique}`;
}
return "";
});
const subPrompts = [ev1.data.analysis, ev2.data.critique];
const prompt = `Based on the following information about a joke:\n${subPrompts.join("\n")}\nProvide a comprehensive report on the joke's quality and impact.`;
const prompt = `Based on the following information about a joke:\n${subPrompts.join(
"\n",
)}\nProvide a comprehensive report on the joke's quality and impact.`;
const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text });
return new StopEvent(response.text);
};
const jokeFlow = new Workflow();
jokeFlow.addStep(StartEvent, generateJoke);
jokeFlow.addStep(JokeEvent, critiqueJoke);
jokeFlow.addStep(JokeEvent, analyzeJoke);
jokeFlow.addStep([AnalysisEvent, CritiqueEvent], reportJoke);
const jokeFlow = new Workflow<unknown, string, string>();
jokeFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [JokeEvent],
},
generateJoke,
);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [CritiqueEvent],
},
critiqueJoke,
);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [AnalysisEvent],
},
analyzeJoke,
);
jokeFlow.addStep(
{
inputs: [AnalysisEvent, CritiqueEvent],
outputs: [StopEvent<string>],
},
reportJoke,
);
// Usage
async function main() {
const result = await jokeFlow.run("pirates");
console.log(result.data.result);
console.log(result.data);
}
main().catch(console.error);
+21 -10
View File
@@ -1,10 +1,9 @@
import {
Context,
StartEvent,
StopEvent,
Workflow,
WorkflowEvent,
} from "@llamaindex/core/workflow";
} from "@llamaindex/workflow";
import { OpenAI } from "llamaindex";
// Create LLM instance
@@ -13,26 +12,38 @@ const llm = new OpenAI();
// Create a custom event type
export class JokeEvent extends WorkflowEvent<{ joke: string }> {}
const generateJoke = async (_context: Context, ev: StartEvent) => {
const prompt = `Write your best joke about ${ev.data.input}.`;
const generateJoke = async (_: unknown, ev: StartEvent<string>) => {
const prompt = `Write your best joke about ${ev.data}.`;
const response = await llm.complete({ prompt });
return new JokeEvent({ joke: response.text });
};
const critiqueJoke = async (_context: Context, ev: JokeEvent) => {
const critiqueJoke = async (_: unknown, ev: JokeEvent) => {
const prompt = `Give a thorough critique of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text });
return new StopEvent(response.text);
};
const jokeFlow = new Workflow({ verbose: true });
jokeFlow.addStep(StartEvent, generateJoke);
jokeFlow.addStep(JokeEvent, critiqueJoke);
const jokeFlow = new Workflow<unknown, string, string>();
jokeFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [JokeEvent],
},
generateJoke,
);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [StopEvent<string>],
},
critiqueJoke,
);
// Usage
async function main() {
const result = await jokeFlow.run("pirates");
console.log(result.data.result);
console.log(result.data);
}
main().catch(console.error);
+32 -15
View File
@@ -1,10 +1,10 @@
import {
Context,
HandlerContext,
StartEvent,
StopEvent,
Workflow,
WorkflowEvent,
} from "@llamaindex/core/workflow";
} from "@llamaindex/workflow";
import { OpenAI } from "llamaindex";
// Create LLM instance
@@ -12,38 +12,55 @@ const llm = new OpenAI();
// Create custom event types
export class JokeEvent extends WorkflowEvent<{ joke: string }> {}
export class MessageEvent extends WorkflowEvent<{ msg: string }> {}
const generateJoke = async (context: Context, ev: StartEvent) => {
context.writeEventToStream(
new MessageEvent({ msg: `Generating a joke about: ${ev.data.input}` }),
const generateJoke = async (context: HandlerContext, ev: StartEvent) => {
context.sendEvent(
new MessageEvent({ msg: `Generating a joke about: ${ev.data}` }),
);
const prompt = `Write your best joke about ${ev.data.input}.`;
const prompt = `Write your best joke about ${ev.data}.`;
const response = await llm.complete({ prompt });
return new JokeEvent({ joke: response.text });
};
const critiqueJoke = async (context: Context, ev: JokeEvent) => {
context.writeEventToStream(
const critiqueJoke = async (context: HandlerContext, ev: JokeEvent) => {
context.sendEvent(
new MessageEvent({ msg: `Write a critique of this joke: ${ev.data.joke}` }),
);
const prompt = `Give a thorough critique of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text });
return new StopEvent(response.text);
};
const jokeFlow = new Workflow();
jokeFlow.addStep(StartEvent, generateJoke);
jokeFlow.addStep(JokeEvent, critiqueJoke);
jokeFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [JokeEvent],
},
generateJoke,
);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [StopEvent<string>],
},
critiqueJoke,
);
// Usage
async function main() {
const run = jokeFlow.run("pirates");
for await (const event of jokeFlow.streamEvents()) {
console.log((event as MessageEvent).data.msg);
for await (const event of run) {
if (event instanceof MessageEvent) {
console.log("Message:");
console.log((event as MessageEvent).data.msg);
} else if (event instanceof StopEvent) {
console.log("Result:");
console.log((event as StopEvent<string>).data);
}
}
const result = await run;
console.log(result.data.result);
}
main().catch(console.error);
+25 -14
View File
@@ -1,19 +1,21 @@
import {
Context,
StartEvent,
StopEvent,
Workflow,
} from "@llamaindex/core/workflow";
import { StartEvent, StopEvent, Workflow } from "@llamaindex/workflow";
const longRunning = async (_context: Context, ev: StartEvent) => {
const longRunning = async (_: unknown, ev: StartEvent<string>) => {
await new Promise((resolve) => setTimeout(resolve, 2000)); // Wait for 2 seconds
return new StopEvent({ result: "We waited 2 seconds" });
return new StopEvent("We waited 2 seconds");
};
async function timeout() {
const workflow = new Workflow({ verbose: true, timeout: 1 });
workflow.addStep(StartEvent, longRunning);
// This will timeout
const workflow = new Workflow<unknown, string, string>({
timeout: 1,
});
workflow.addStep(
{
inputs: [StartEvent<string>],
outputs: [StopEvent<string>],
},
longRunning,
);
try {
await workflow.run("Let's start");
} catch (error) {
@@ -23,14 +25,23 @@ async function timeout() {
async function notimeout() {
// Increase timeout to 3 seconds - no timeout
const workflow = new Workflow({ verbose: true, timeout: 3 });
workflow.addStep(StartEvent, longRunning);
const workflow = new Workflow<unknown, string, string>({
timeout: 3,
});
workflow.addStep(
{
inputs: [StartEvent<string>],
outputs: [StopEvent<string>],
},
longRunning,
);
const result = await workflow.run("Let's start");
console.log(result.data.result);
console.log(result.data);
}
async function main() {
await timeout();
console.log("---");
await notimeout();
}
+40 -15
View File
@@ -1,10 +1,9 @@
import {
Context,
StartEvent,
StopEvent,
Workflow,
WorkflowEvent,
} from "@llamaindex/core/workflow";
} from "@llamaindex/workflow";
import { OpenAI } from "llamaindex";
// Create LLM instance
@@ -13,40 +12,66 @@ const llm = new OpenAI();
// Create a custom event type
export class JokeEvent extends WorkflowEvent<{ joke: string }> {}
const generateJoke = async (_context: Context, ev: StartEvent) => {
const prompt = `Write your best joke about ${ev.data.input}.`;
const generateJoke = async (_: unknown, ev: StartEvent<string>) => {
const prompt = `Write your best joke about ${ev.data}.`;
const response = await llm.complete({ prompt });
return new JokeEvent({ joke: response.text });
};
const critiqueJoke = async (_context: Context, ev: JokeEvent) => {
const critiqueJoke = async (_: unknown, ev: JokeEvent) => {
const prompt = `Give a thorough critique of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text });
return new StopEvent(response.text);
};
async function validateFails() {
try {
const jokeFlow = new Workflow({ verbose: true, validate: true });
jokeFlow.addStep(StartEvent, generateJoke, { outputs: StopEvent });
jokeFlow.addStep(JokeEvent, critiqueJoke, { outputs: StopEvent });
await jokeFlow.run("pirates");
const jokeFlow = new Workflow();
jokeFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [StopEvent<string>],
},
// @ts-expect-error outputs should be JokeEvent
generateJoke,
);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [StopEvent],
},
critiqueJoke,
);
await jokeFlow.run("pirates").strict();
} catch (e) {
console.error("Validation failed:", e);
}
}
async function validate() {
const jokeFlow = new Workflow({ verbose: true, validate: true });
jokeFlow.addStep(StartEvent, generateJoke, { outputs: JokeEvent });
jokeFlow.addStep(JokeEvent, critiqueJoke, { outputs: StopEvent });
const result = await jokeFlow.run("pirates");
console.log(result.data.result);
const jokeFlow = new Workflow();
jokeFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [JokeEvent],
},
generateJoke,
);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [StopEvent<string>],
},
critiqueJoke,
);
const result = await jokeFlow.run("pirates").strict();
console.log(result.data);
}
// Usage
async function main() {
await validateFails();
console.log("---");
await validate();
}
+6 -12
View File
@@ -19,28 +19,22 @@
},
"devDependencies": {
"@changesets/cli": "^2.27.5",
"eslint": "9.14.0",
"eslint-config-next": "^15.0.2",
"eslint": "9.15.0",
"eslint-config-next": "^15.0.3",
"eslint-config-prettier": "^9.1.0",
"eslint-config-turbo": "^2.2.3",
"eslint-config-turbo": "^2.3.0",
"eslint-plugin-react": "7.37.2",
"globals": "^15.12.0",
"husky": "^9.1.6",
"husky": "^9.1.7",
"lint-staged": "^15.2.10",
"madge": "^8.0.0",
"prettier": "^3.3.3",
"prettier-plugin-organize-imports": "^4.1.0",
"turbo": "^2.2.3",
"turbo": "^2.3.0",
"typescript": "^5.6.3",
"typescript-eslint": "^8.13.0"
"typescript-eslint": "^8.15.0"
},
"packageManager": "pnpm@9.12.3",
"pnpm": {
"overrides": {
"trim": "1.0.1",
"protobufjs": "7.2.6"
}
},
"lint-staged": {
"(!apps/docs/i18n/**/docusaurus-plugin-content-docs/current/api/*).{js,jsx,ts,tsx,md}": "prettier --write"
}
+97
View File
@@ -1,5 +1,102 @@
# @llamaindex/autotool
## 5.0.22
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
## 5.0.21
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
## 5.0.20
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
## 5.0.19
### Patch Changes
- 90d265c: chore: bump version
- Updated dependencies [90d265c]
- llamaindex@0.8.19
## 5.0.18
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
## 5.0.17
### Patch Changes
- llamaindex@0.8.17
## 5.0.16
### Patch Changes
- llamaindex@0.8.16
## 5.0.15
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
## 5.0.14
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
## 5.0.13
### Patch Changes
- llamaindex@0.8.13
## 5.0.12
### Patch Changes
- llamaindex@0.8.12
## 5.0.11
### Patch Changes
- llamaindex@0.8.11
## 5.0.10
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 5.0.9
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 5.0.8
### Patch Changes
@@ -1,5 +1,115 @@
# @llamaindex/autotool-01-node-example
## 0.0.65
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
- @llamaindex/autotool@5.0.22
## 0.0.64
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
- @llamaindex/autotool@5.0.21
## 0.0.63
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
- @llamaindex/autotool@5.0.20
## 0.0.62
### Patch Changes
- Updated dependencies [90d265c]
- @llamaindex/autotool@5.0.19
- llamaindex@0.8.19
## 0.0.61
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
- @llamaindex/autotool@5.0.18
## 0.0.60
### Patch Changes
- llamaindex@0.8.17
- @llamaindex/autotool@5.0.17
## 0.0.59
### Patch Changes
- llamaindex@0.8.16
- @llamaindex/autotool@5.0.16
## 0.0.58
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
- @llamaindex/autotool@5.0.15
## 0.0.57
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
- @llamaindex/autotool@5.0.14
## 0.0.56
### Patch Changes
- llamaindex@0.8.13
- @llamaindex/autotool@5.0.13
## 0.0.55
### Patch Changes
- llamaindex@0.8.12
- @llamaindex/autotool@5.0.12
## 0.0.54
### Patch Changes
- llamaindex@0.8.11
- @llamaindex/autotool@5.0.11
## 0.0.53
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
- @llamaindex/autotool@5.0.10
## 0.0.52
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
- @llamaindex/autotool@5.0.9
## 0.0.51
### Patch Changes
@@ -5,7 +5,7 @@
"dependencies": {
"@llamaindex/autotool": "workspace:*",
"llamaindex": "workspace:*",
"openai": "^4.57.0"
"openai": "^4.72.0"
},
"devDependencies": {
"tsx": "^4.19.0"
@@ -13,5 +13,5 @@
"scripts": {
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
},
"version": "0.0.51"
"version": "0.0.65"
}
@@ -1,5 +1,115 @@
# @llamaindex/autotool-02-next-example
## 0.1.109
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
- @llamaindex/autotool@5.0.22
## 0.1.108
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
- @llamaindex/autotool@5.0.21
## 0.1.107
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
- @llamaindex/autotool@5.0.20
## 0.1.106
### Patch Changes
- Updated dependencies [90d265c]
- @llamaindex/autotool@5.0.19
- llamaindex@0.8.19
## 0.1.105
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
- @llamaindex/autotool@5.0.18
## 0.1.104
### Patch Changes
- llamaindex@0.8.17
- @llamaindex/autotool@5.0.17
## 0.1.103
### Patch Changes
- llamaindex@0.8.16
- @llamaindex/autotool@5.0.16
## 0.1.102
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
- @llamaindex/autotool@5.0.15
## 0.1.101
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
- @llamaindex/autotool@5.0.14
## 0.1.100
### Patch Changes
- llamaindex@0.8.13
- @llamaindex/autotool@5.0.13
## 0.1.99
### Patch Changes
- llamaindex@0.8.12
- @llamaindex/autotool@5.0.12
## 0.1.98
### Patch Changes
- llamaindex@0.8.11
- @llamaindex/autotool@5.0.11
## 0.1.97
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
- @llamaindex/autotool@5.0.10
## 0.1.96
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
- @llamaindex/autotool@5.0.9
## 0.1.95
### Patch Changes
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/autotool-02-next-example",
"private": true,
"version": "0.1.95",
"version": "0.1.109",
"scripts": {
"dev": "next dev",
"build": "next build",
@@ -10,17 +10,17 @@
"dependencies": {
"@llamaindex/autotool": "workspace:*",
"@radix-ui/react-slot": "^1.1.0",
"ai": "^3.3.21",
"ai": "^4.0.0",
"class-variance-authority": "^0.7.0",
"dotenv": "^16.3.1",
"llamaindex": "workspace:*",
"lucide-react": "^0.436.0",
"next": "15.0.2",
"lucide-react": "^0.460.0",
"next": "15.0.3",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-markdown": "^9.0.1",
"react-syntax-highlighter": "^15.5.0",
"sonner": "^1.5.0",
"sonner": "^1.7.0",
"tailwind-merge": "^2.5.2"
},
"devDependencies": {
@@ -30,8 +30,8 @@
"@types/react-syntax-highlighter": "^15.5.11",
"autoprefixer": "^10.4.20",
"cross-env": "^7.0.3",
"postcss": "^8.4.41",
"tailwindcss": "^3.4.10",
"postcss": "^8.4.49",
"tailwindcss": "^3.4.15",
"typescript": "^5.6.3"
}
}
+7 -7
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/autotool",
"type": "module",
"version": "5.0.8",
"version": "5.0.22",
"description": "auto transpile your JS function to LLM Agent compatible",
"files": [
"dist",
@@ -45,10 +45,10 @@
"dev": "bunchee --watch"
},
"dependencies": {
"@swc/core": "^1.7.22",
"jotai": "2.8.4",
"@swc/core": "^1.9.2",
"jotai": "2.10.2",
"typedoc": "^0.26.11",
"unplugin": "^1.12.2"
"unplugin": "^1.16.0"
},
"peerDependencies": {
"llamaindex": "workspace:*",
@@ -72,11 +72,11 @@
"@types/node": "^22.9.0",
"bunchee": "5.6.1",
"llamaindex": "workspace:*",
"next": "15.0.2",
"rollup": "^4.24.4",
"next": "15.0.3",
"rollup": "^4.27.3",
"tsx": "^4.19.0",
"typescript": "^5.6.3",
"vitest": "^2.1.4",
"vitest": "^2.1.5",
"webpack": "^5.94.0"
}
}
+1 -1
View File
@@ -22,7 +22,7 @@ export type InfoString = {
parameterMapping: Record<string, number>;
};
export const store = createStore();
export const store: ReturnType<typeof createStore> = createStore();
export const toolMetadataAtom = atom<[ToolMetadata, Info][]>([]);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const toolsAtom = atom<Record<string, (...args: any[]) => any>>({});
+69
View File
@@ -1,5 +1,74 @@
# @llamaindex/cloud
## 2.0.14
### Patch Changes
- Updated dependencies [969365c]
- @llamaindex/env@0.1.22
- @llamaindex/core@0.4.14
## 2.0.13
### Patch Changes
- 90d265c: chore: bump version
- Updated dependencies [90d265c]
- @llamaindex/core@0.4.13
- @llamaindex/env@0.1.21
## 2.0.12
### Patch Changes
- Updated dependencies [ef4f63d]
- @llamaindex/core@0.4.12
## 2.0.11
### Patch Changes
- Updated dependencies [6d22fa2]
- @llamaindex/core@0.4.11
## 2.0.10
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 2.0.9
### Patch Changes
- Updated dependencies [7ae6eaa]
- @llamaindex/core@0.4.9
## 2.0.8
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
## 2.0.7
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
## 2.0.6
### Patch Changes
- Updated dependencies [4fc001c]
- @llamaindex/env@0.1.20
- @llamaindex/core@0.4.6
## 2.0.5
### Patch Changes
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@llamaindex/cloud",
"version": "2.0.5",
"version": "2.0.14",
"type": "module",
"license": "MIT",
"scripts": {
@@ -50,8 +50,8 @@
"directory": "packages/cloud"
},
"devDependencies": {
"@hey-api/client-fetch": "^0.4.2",
"@hey-api/openapi-ts": "^0.54.3",
"@hey-api/client-fetch": "^0.4.4",
"@hey-api/openapi-ts": "^0.56.0",
"@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*",
"bunchee": "5.6.1"
+69
View File
@@ -1,5 +1,74 @@
# @llamaindex/community
## 0.0.72
### Patch Changes
- Updated dependencies [969365c]
- @llamaindex/env@0.1.22
- @llamaindex/core@0.4.14
## 0.0.71
### Patch Changes
- 90d265c: chore: bump version
- Updated dependencies [90d265c]
- @llamaindex/core@0.4.13
- @llamaindex/env@0.1.21
## 0.0.70
### Patch Changes
- Updated dependencies [ef4f63d]
- @llamaindex/core@0.4.12
## 0.0.69
### Patch Changes
- Updated dependencies [6d22fa2]
- @llamaindex/core@0.4.11
## 0.0.68
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 0.0.67
### Patch Changes
- Updated dependencies [7ae6eaa]
- @llamaindex/core@0.4.9
## 0.0.66
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
## 0.0.65
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
## 0.0.64
### Patch Changes
- Updated dependencies [4fc001c]
- @llamaindex/env@0.1.20
- @llamaindex/core@0.4.6
## 0.0.63
### Patch Changes
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/community",
"description": "Community package for LlamaIndexTS",
"version": "0.0.63",
"version": "0.0.72",
"type": "module",
"types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js",
@@ -46,8 +46,8 @@
"bunchee": "5.6.1"
},
"dependencies": {
"@aws-sdk/client-bedrock-agent-runtime": "^3.642.0",
"@aws-sdk/client-bedrock-runtime": "^3.642.0",
"@aws-sdk/client-bedrock-agent-runtime": "^3.693.0",
"@aws-sdk/client-bedrock-runtime": "^3.693.0",
"@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*"
}
+60
View File
@@ -1,5 +1,65 @@
# @llamaindex/core
## 0.4.14
### Patch Changes
- Updated dependencies [969365c]
- @llamaindex/env@0.1.22
## 0.4.13
### Patch Changes
- 90d265c: chore: bump version
- Updated dependencies [90d265c]
- @llamaindex/env@0.1.21
## 0.4.12
### Patch Changes
- ef4f63d: refactor: move mockLLM to core
## 0.4.11
### Patch Changes
- 6d22fa2: Get PromptTemplate template variables at run-time
## 0.4.10
### Patch Changes
- a7b0ac3: fix: update tool call llm type
- c69605f: feat: add async support to BaseChatStore and BaseChatStoreMemory
## 0.4.9
### Patch Changes
- 7ae6eaa: feat: allow pass `additionalChatOptions` to agent
## 0.4.8
### Patch Changes
- f865c98: feat: async get message on chat store
## 0.4.7
### Patch Changes
- d89ebe0: feat: better support for zod schema
- fd8c882: chore: add warning on legacy workflow API
## 0.4.6
### Patch Changes
- Updated dependencies [4fc001c]
- @llamaindex/env@0.1.20
## 0.4.5
### Patch Changes
+3 -3
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/core",
"type": "module",
"version": "0.4.5",
"version": "0.4.14",
"description": "LlamaIndex Core Module",
"exports": {
"./agent": {
@@ -389,10 +389,10 @@
"url": "https://github.com/run-llama/LlamaIndexTS.git"
},
"devDependencies": {
"@edge-runtime/vm": "^4.0.3",
"@edge-runtime/vm": "^4.0.4",
"ajv": "^8.17.1",
"bunchee": "5.6.1",
"happy-dom": "^15.11.0",
"happy-dom": "^15.11.6",
"natural": "^8.0.1"
},
"dependencies": {
+77 -15
View File
@@ -106,11 +106,17 @@ export type AgentRunnerParams<
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> = {
llm: AI;
chatHistory: ChatMessage<AdditionalMessageOptions>[];
systemPrompt: MessageContent | null;
runner: AgentWorker<AI, Store, AdditionalMessageOptions>;
runner: AgentWorker<
AI,
Store,
AdditionalMessageOptions,
AdditionalChatOptions
>;
tools:
| BaseToolWithCall[]
| ((query: MessageContent) => Promise<BaseToolWithCall[]>);
@@ -125,6 +131,7 @@ export type AgentParamsBase<
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> =
| {
llm?: AI;
@@ -132,6 +139,7 @@ export type AgentParamsBase<
systemPrompt?: MessageContent;
verbose?: boolean;
tools: BaseToolWithCall[];
additionalChatOptions?: AdditionalChatOptions;
}
| {
llm?: AI;
@@ -139,6 +147,7 @@ export type AgentParamsBase<
systemPrompt?: MessageContent;
verbose?: boolean;
toolRetriever: ObjectRetriever<BaseToolWithCall>;
additionalChatOptions?: AdditionalChatOptions;
};
/**
@@ -153,21 +162,36 @@ export abstract class AgentWorker<
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> {
#taskSet = new Set<TaskStep<AI, Store, AdditionalMessageOptions>>();
abstract taskHandler: TaskHandler<AI, Store, AdditionalMessageOptions>;
#taskSet = new Set<
TaskStep<AI, Store, AdditionalMessageOptions, AdditionalChatOptions>
>();
abstract taskHandler: TaskHandler<
AI,
Store,
AdditionalMessageOptions,
AdditionalChatOptions
>;
public createTask(
query: MessageContent,
context: AgentTaskContext<AI, Store, AdditionalMessageOptions>,
): ReadableStream<TaskStepOutput<AI, Store, AdditionalMessageOptions>> {
context: AgentTaskContext<
AI,
Store,
AdditionalMessageOptions,
AdditionalChatOptions
>,
): ReadableStream<
TaskStepOutput<AI, Store, AdditionalMessageOptions, AdditionalChatOptions>
> {
context.store.messages.push({
role: "user",
content: query,
});
const taskOutputStream = createTaskOutputStream(this.taskHandler, context);
return new ReadableStream<
TaskStepOutput<AI, Store, AdditionalMessageOptions>
TaskStepOutput<AI, Store, AdditionalMessageOptions, AdditionalChatOptions>
>({
start: async (controller) => {
for await (const stepOutput of taskOutputStream) {
@@ -176,7 +200,8 @@ export abstract class AgentWorker<
let currentStep: TaskStep<
AI,
Store,
AdditionalMessageOptions
AdditionalMessageOptions,
AdditionalChatOptions
> | null = stepOutput.taskStep;
while (currentStep) {
this.#taskSet.delete(currentStep);
@@ -227,6 +252,7 @@ export abstract class AgentRunner<
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> extends BaseChatEngine {
readonly #llm: AI;
readonly #tools:
@@ -234,7 +260,12 @@ export abstract class AgentRunner<
| ((query: MessageContent) => Promise<BaseToolWithCall[]>);
readonly #systemPrompt: MessageContent | null = null;
#chatHistory: ChatMessage<AdditionalMessageOptions>[];
readonly #runner: AgentWorker<AI, Store, AdditionalMessageOptions>;
readonly #runner: AgentWorker<
AI,
Store,
AdditionalMessageOptions,
AdditionalChatOptions
>;
readonly #verbose: boolean;
// create extra store
@@ -245,7 +276,7 @@ export abstract class AgentRunner<
}
static defaultTaskHandler: TaskHandler<LLM> = async (step, enqueueOutput) => {
const { llm, getTools, stream } = step.context;
const { llm, getTools, stream, additionalChatOptions } = step.context;
const lastMessage = step.context.store.messages.at(-1)!.content;
const tools = await getTools(lastMessage);
if (!stream) {
@@ -253,8 +284,9 @@ export abstract class AgentRunner<
stream,
tools,
messages: [...step.context.store.messages],
additionalChatOptions,
});
await stepTools<LLM>({
await stepTools({
response,
tools,
step,
@@ -265,6 +297,7 @@ export abstract class AgentRunner<
stream,
tools,
messages: [...step.context.store.messages],
additionalChatOptions,
});
await stepToolsStreaming<LLM>({
response,
@@ -276,7 +309,12 @@ export abstract class AgentRunner<
};
protected constructor(
params: AgentRunnerParams<AI, Store, AdditionalMessageOptions>,
params: AgentRunnerParams<
AI,
Store,
AdditionalMessageOptions,
AdditionalChatOptions
>,
) {
super();
const { llm, chatHistory, systemPrompt, runner, tools, verbose } = params;
@@ -330,6 +368,7 @@ export abstract class AgentRunner<
stream: boolean = false,
verbose: boolean | undefined = undefined,
chatHistory?: ChatMessage<AdditionalMessageOptions>[],
additionalChatOptions?: AdditionalChatOptions,
) {
const initialMessages = [...(chatHistory ?? this.#chatHistory)];
if (this.#systemPrompt !== null) {
@@ -348,6 +387,7 @@ export abstract class AgentRunner<
stream,
toolCallCount: 0,
llm: this.#llm,
additionalChatOptions: additionalChatOptions ?? {},
getTools: (message) => this.getTools(message),
store: {
...this.createStore(),
@@ -365,13 +405,29 @@ export abstract class AgentRunner<
});
}
async chat(params: NonStreamingChatEngineParams): Promise<EngineResponse>;
async chat(
params: StreamingChatEngineParams,
params: NonStreamingChatEngineParams<
AdditionalMessageOptions,
AdditionalChatOptions
>,
): Promise<EngineResponse>;
async chat(
params: StreamingChatEngineParams<
AdditionalMessageOptions,
AdditionalChatOptions
>,
): Promise<ReadableStream<EngineResponse>>;
@wrapEventCaller
async chat(
params: NonStreamingChatEngineParams | StreamingChatEngineParams,
params:
| NonStreamingChatEngineParams<
AdditionalMessageOptions,
AdditionalChatOptions
>
| StreamingChatEngineParams<
AdditionalMessageOptions,
AdditionalChatOptions
>,
): Promise<EngineResponse | ReadableStream<EngineResponse>> {
let chatHistory: ChatMessage<AdditionalMessageOptions>[] = [];
@@ -388,6 +444,7 @@ export abstract class AgentRunner<
!!params.stream,
false,
chatHistory,
params.chatOptions,
);
for await (const stepOutput of task) {
// update chat history for each round
@@ -398,7 +455,12 @@ export abstract class AgentRunner<
return output.pipeThrough(
new TransformStream<EngineResponse>({
transform(chunk, controller) {
controller.enqueue(EngineResponse.fromChatResponseChunk(chunk));
controller.enqueue(
EngineResponse.fromChatResponseChunk(
chunk,
chunk.sourceNodes,
),
);
},
}),
);
+47 -5
View File
@@ -4,24 +4,66 @@ import { ObjectRetriever } from "../objects";
import { AgentRunner, AgentWorker, type AgentParamsBase } from "./base.js";
import { validateAgentParams } from "./utils.js";
type LLMParamsBase = AgentParamsBase<LLM>;
type LLMParamsBase<
AI extends LLM,
AdditionalMessageOptions extends object = AI extends LLM<
object,
infer AdditionalMessageOptions
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> = AgentParamsBase<AI, AdditionalMessageOptions, AdditionalChatOptions>;
type LLMParamsWithTools = LLMParamsBase & {
type LLMParamsWithTools<
AI extends LLM,
AdditionalMessageOptions extends object = AI extends LLM<
object,
infer AdditionalMessageOptions
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> = LLMParamsBase<AI, AdditionalMessageOptions, AdditionalChatOptions> & {
tools: BaseToolWithCall[];
};
type LLMParamsWithToolRetriever = LLMParamsBase & {
type LLMParamsWithToolRetriever<
AI extends LLM,
AdditionalMessageOptions extends object = AI extends LLM<
object,
infer AdditionalMessageOptions
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> = LLMParamsBase<AI, AdditionalMessageOptions, AdditionalChatOptions> & {
toolRetriever: ObjectRetriever<BaseToolWithCall>;
};
export type LLMAgentParams = LLMParamsWithTools | LLMParamsWithToolRetriever;
export type LLMAgentParams<
AI extends LLM,
AdditionalMessageOptions extends object = AI extends LLM<
object,
infer AdditionalMessageOptions
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> =
| LLMParamsWithTools<AI, AdditionalMessageOptions, AdditionalChatOptions>
| LLMParamsWithToolRetriever<
AI,
AdditionalMessageOptions,
AdditionalChatOptions
>;
export class LLMAgentWorker extends AgentWorker<LLM> {
taskHandler = AgentRunner.defaultTaskHandler;
}
export class LLMAgent extends AgentRunner<LLM> {
constructor(params: LLMAgentParams) {
constructor(params: LLMAgentParams<LLM>) {
validateAgentParams(params);
const llm = params.llm ?? (Settings.llm ? (Settings.llm as LLM) : null);
if (!llm)
+33 -6
View File
@@ -19,6 +19,7 @@ export type AgentTaskContext<
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> = {
readonly stream: boolean;
readonly toolCallCount: number;
@@ -26,6 +27,7 @@ export type AgentTaskContext<
readonly getTools: (
input: MessageContent,
) => BaseToolWithCall[] | Promise<BaseToolWithCall[]>;
readonly additionalChatOptions: Partial<AdditionalChatOptions>;
shouldContinue: (
taskStep: Readonly<TaskStep<Model, Store, AdditionalMessageOptions>>,
) => boolean;
@@ -45,13 +47,26 @@ export type TaskStep<
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> = {
id: UUID;
context: AgentTaskContext<Model, Store, AdditionalMessageOptions>;
context: AgentTaskContext<
Model,
Store,
AdditionalMessageOptions,
AdditionalChatOptions
>;
// linked list
prevStep: TaskStep<Model, Store, AdditionalMessageOptions> | null;
nextSteps: Set<TaskStep<Model, Store, AdditionalMessageOptions>>;
prevStep: TaskStep<
Model,
Store,
AdditionalMessageOptions,
AdditionalChatOptions
> | null;
nextSteps: Set<
TaskStep<Model, Store, AdditionalMessageOptions, AdditionalChatOptions>
>;
};
export type TaskStepOutput<
@@ -63,8 +78,14 @@ export type TaskStepOutput<
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> = {
taskStep: TaskStep<Model, Store, AdditionalMessageOptions>;
taskStep: TaskStep<
Model,
Store,
AdditionalMessageOptions,
AdditionalChatOptions
>;
// output shows the response to the user
output:
| ChatResponse<AdditionalMessageOptions>
@@ -81,10 +102,16 @@ export type TaskHandler<
>
? AdditionalMessageOptions
: never,
AdditionalChatOptions extends object = object,
> = (
step: TaskStep<Model, Store, AdditionalMessageOptions>,
step: TaskStep<Model, Store, AdditionalMessageOptions, AdditionalChatOptions>,
enqueueOutput: (
taskOutput: TaskStepOutput<Model, Store, AdditionalMessageOptions>,
taskOutput: TaskStepOutput<
Model,
Store,
AdditionalMessageOptions,
AdditionalChatOptions
>,
) => void,
) => Promise<void>;
+4
View File
@@ -16,14 +16,18 @@ export interface BaseChatEngineParams<
export interface StreamingChatEngineParams<
AdditionalMessageOptions extends object = object,
AdditionalChatOptions extends object = object,
> extends BaseChatEngineParams<AdditionalMessageOptions> {
stream: true;
chatOptions?: AdditionalChatOptions;
}
export interface NonStreamingChatEngineParams<
AdditionalMessageOptions extends object = object,
AdditionalChatOptions extends object = object,
> extends BaseChatEngineParams<AdditionalMessageOptions> {
stream?: false;
chatOptions?: AdditionalChatOptions;
}
export abstract class BaseChatEngine {
+4 -3
View File
@@ -1,5 +1,4 @@
import { streamConverter } from "../utils";
import { extractText } from "../utils/llms";
import { extractText, streamConverter } from "../utils";
import type {
ChatResponse,
ChatResponseChunk,
@@ -67,6 +66,8 @@ export abstract class BaseLLM<
export abstract class ToolCallLLM<
AdditionalChatOptions extends object = object,
> extends BaseLLM<AdditionalChatOptions, ToolCallLLMMessageOptions> {
AdditionalMessageOptions extends
ToolCallLLMMessageOptions = ToolCallLLMMessageOptions,
> extends BaseLLM<AdditionalChatOptions, AdditionalMessageOptions> {
abstract supportToolCall: boolean;
}
+6 -4
View File
@@ -65,19 +65,21 @@ export abstract class BaseChatStoreMemory<
super();
}
getAllMessages(): ChatMessage<AdditionalMessageOptions>[] {
getAllMessages():
| ChatMessage<AdditionalMessageOptions>[]
| Promise<ChatMessage<AdditionalMessageOptions>[]> {
return this.chatStore.getMessages(this.chatStoreKey);
}
put(messages: ChatMessage<AdditionalMessageOptions>) {
put(messages: ChatMessage<AdditionalMessageOptions>): void | Promise<void> {
this.chatStore.addMessage(this.chatStoreKey, messages);
}
set(messages: ChatMessage<AdditionalMessageOptions>[]) {
set(messages: ChatMessage<AdditionalMessageOptions>[]): void | Promise<void> {
this.chatStore.setMessages(this.chatStoreKey, messages);
}
reset() {
reset(): void | Promise<void> {
this.chatStore.deleteMessages(this.chatStoreKey);
}
}
@@ -33,11 +33,11 @@ export class ChatMemoryBuffer<
}
}
getMessages(
async getMessages(
transientMessages?: ChatMessage<AdditionalMessageOptions>[] | undefined,
initialTokenCount: number = 0,
) {
const messages = this.getAllMessages();
const messages = await this.getAllMessages();
if (initialTokenCount > this.tokenLimit) {
throw new Error("Initial token count exceeds token limit");
+13
View File
@@ -32,6 +32,10 @@ export abstract class BasePromptTemplate<
const Vars extends readonly string[] = string[],
> {
metadata: Metadata = {};
/**
* Set of template variables used in the prompt template. Used for type hints only.
* To get the list of template variables used in the prompt at run-time, use the `vars` method.
*/
templateVars: Set<string> = new Set();
options: Partial<Record<TemplatesVar[number] | (string & {}), string>> = {};
outputParser: BaseOutputParser | undefined;
@@ -223,4 +227,13 @@ export class PromptTemplate<
get template(): Template {
return this.#template;
}
/**
* Returns all the template variables used in the prompt template.
*/
vars(): string[] {
const template = this.template;
const matches = template.match(/\{([^}]+)\}/g) || [];
return [...new Set(matches.map((match) => match.slice(1, -1)))];
}
}
@@ -7,7 +7,11 @@ export abstract class BaseChatStore<
key: string,
messages: ChatMessage<AdditionalMessageOptions>[],
): void;
abstract getMessages(key: string): ChatMessage<AdditionalMessageOptions>[];
abstract getMessages(
key: string,
):
| ChatMessage<AdditionalMessageOptions>[]
| Promise<ChatMessage<AdditionalMessageOptions>[]>;
abstract addMessage(
key: string,
message: ChatMessage<AdditionalMessageOptions>,
@@ -15,5 +19,7 @@ export abstract class BaseChatStore<
): void;
abstract deleteMessages(key: string): void;
abstract deleteMessage(key: string, idx: number): void;
abstract getKeys(): IterableIterator<string>;
abstract getKeys():
| IterableIterator<string>
| Promise<IterableIterator<string>>;
}
+21 -13
View File
@@ -4,18 +4,12 @@ import { zodToJsonSchema } from "zod-to-json-schema";
import type { JSONValue } from "../global";
import type { BaseTool, ToolMetadata } from "../llms";
const kOriginalFn = Symbol("originalFn");
export class FunctionTool<T, R extends JSONValue | Promise<JSONValue>>
implements BaseTool<T>
{
[kOriginalFn]?: (input: T) => R;
#fn: (input: T) => R;
#metadata: ToolMetadata<JSONSchemaType<T>>;
// todo: for the future, we can use zod to validate the input parameters
// eslint-disable-next-line no-unused-private-class-members
#zodType: z.ZodType<T> | null = null;
readonly #metadata: ToolMetadata<JSONSchemaType<T>>;
readonly #zodType: z.ZodType<T> | null = null;
constructor(
fn: (input: T) => R,
metadata: ToolMetadata<JSONSchemaType<T>>,
@@ -32,6 +26,12 @@ export class FunctionTool<T, R extends JSONValue | Promise<JSONValue>>
fn: (input: T) => JSONValue | Promise<JSONValue>,
schema: ToolMetadata<JSONSchemaType<T>>,
): FunctionTool<T, JSONValue | Promise<JSONValue>>;
static from<R extends z.ZodType>(
fn: (input: z.infer<R>) => JSONValue | Promise<JSONValue>,
schema: Omit<ToolMetadata, "parameters"> & {
parameters: R;
},
): FunctionTool<z.infer<R>, JSONValue | Promise<JSONValue>>;
static from<T, R extends z.ZodType<T>>(
fn: (input: T) => JSONValue | Promise<JSONValue>,
schema: Omit<ToolMetadata, "parameters"> & {
@@ -40,15 +40,15 @@ export class FunctionTool<T, R extends JSONValue | Promise<JSONValue>>
): FunctionTool<T, JSONValue>;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
static from(fn: any, schema: any): any {
if (schema.parameter instanceof z.ZodSchema) {
const jsonSchema = zodToJsonSchema(schema.parameter);
if (schema.parameters instanceof z.ZodSchema) {
const jsonSchema = zodToJsonSchema(schema.parameters);
return new FunctionTool(
fn,
{
...schema,
parameters: jsonSchema,
},
schema.parameter,
schema.parameters,
);
}
return new FunctionTool(fn, schema);
@@ -58,7 +58,15 @@ export class FunctionTool<T, R extends JSONValue | Promise<JSONValue>>
return this.#metadata as BaseTool<T>["metadata"];
}
call(input: T) {
call = (input: T) => {
if (this.#zodType) {
const result = this.#zodType.safeParse(input);
if (result.success) {
return this.#fn.call(null, result.data);
} else {
console.warn(result.error.errors);
}
}
return this.#fn.call(null, input);
}
};
}
+1
View File
@@ -76,6 +76,7 @@ export {
extractText,
imageToDataUrl,
messagesToHistory,
MockLLM,
toToolDescriptions,
} from "./llms";
+88
View File
@@ -2,6 +2,15 @@ import { fs } from "@llamaindex/env";
import { filetypemime } from "magic-bytes.js";
import type {
ChatMessage,
ChatResponse,
ChatResponseChunk,
CompletionResponse,
LLM,
LLMChatParamsNonStreaming,
LLMChatParamsStreaming,
LLMCompletionParamsNonStreaming,
LLMCompletionParamsStreaming,
LLMMetadata,
MessageContent,
MessageContentDetail,
MessageContentTextDetail,
@@ -143,3 +152,82 @@ export async function imageToDataUrl(
}
return await blobToDataUrl(input);
}
export class MockLLM implements LLM {
metadata: LLMMetadata;
options: {
timeBetweenToken: number;
responseMessage: string;
};
constructor(options?: {
timeBetweenToken?: number;
responseMessage?: string;
metadata?: LLMMetadata;
}) {
this.options = {
timeBetweenToken: options?.timeBetweenToken ?? 20,
responseMessage: options?.responseMessage ?? "This is a mock response",
};
this.metadata = options?.metadata ?? {
model: "MockLLM",
temperature: 0.5,
topP: 0.5,
contextWindow: 1024,
tokenizer: undefined,
};
}
chat(
params: LLMChatParamsStreaming<object, object>,
): Promise<AsyncIterable<ChatResponseChunk>>;
chat(
params: LLMChatParamsNonStreaming<object, object>,
): Promise<ChatResponse<object>>;
async chat(
params:
| LLMChatParamsStreaming<object, object>
| LLMChatParamsNonStreaming<object, object>,
): Promise<AsyncIterable<ChatResponseChunk> | ChatResponse<object>> {
const responseMessage = this.options.responseMessage;
const timeBetweenToken = this.options.timeBetweenToken;
if (params.stream) {
return (async function* () {
for (const char of responseMessage) {
yield { delta: char, raw: {} };
await new Promise((resolve) => setTimeout(resolve, timeBetweenToken));
}
})();
}
return {
message: { content: responseMessage, role: "assistant" },
raw: {},
};
}
async complete(
params: LLMCompletionParamsStreaming,
): Promise<AsyncIterable<CompletionResponse>>;
async complete(
params: LLMCompletionParamsNonStreaming,
): Promise<CompletionResponse>;
async complete(
params: LLMCompletionParamsStreaming | LLMCompletionParamsNonStreaming,
): Promise<AsyncIterable<CompletionResponse> | CompletionResponse> {
const responseMessage = this.options.responseMessage;
const timeBetweenToken = this.options.timeBetweenToken;
if (params.stream) {
return (async function* () {
for (const char of responseMessage) {
yield { delta: char, text: char, raw: {} };
await new Promise((resolve) => setTimeout(resolve, timeBetweenToken));
}
})();
}
return { text: responseMessage, raw: {} };
}
}
+14
View File
@@ -13,6 +13,8 @@ export type StepFunction<T extends WorkflowEvent = WorkflowEvent> = (
type EventTypeParam = EventTypes | EventTypes[];
let once = false;
export class Workflow {
#steps: Map<
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -29,8 +31,20 @@ export class Workflow {
verbose?: boolean;
timeout?: number;
validate?: boolean;
ignoreDeprecatedWarning?: boolean;
} = {},
) {
if (!once && !params.ignoreDeprecatedWarning) {
console.warn(
"@llamaindex/core/workflow is going to use the new workflow API in the next major version.",
"Please update your imports to @llamaindex/workflow",
);
console.warn(
"See https://ts.llamaindex.ai/docs/llamaindex/guide/workflow for more information",
);
once = true;
}
this.#verbose = params.verbose ?? false;
this.#timeout = params.timeout ?? null;
this.#validate = params.validate ?? false;
@@ -19,7 +19,7 @@ describe("ChatMemoryBuffer", () => {
expect(buffer.tokenLimit).toBe(500);
});
test("getMessages returns all messages when under token limit", () => {
test("getMessages returns all messages when under token limit", async () => {
const messages: ChatMessage[] = [
{ role: "user", content: "Hello" },
{ role: "assistant", content: "Hi there!" },
@@ -30,11 +30,11 @@ describe("ChatMemoryBuffer", () => {
chatHistory: messages,
});
const result = buffer.getMessages();
const result = await buffer.getMessages();
expect(result).toEqual(messages);
});
test("getMessages truncates messages when over token limit", () => {
test("getMessages truncates messages when over token limit", async () => {
const messages: ChatMessage[] = [
{ role: "user", content: "This is a long message" },
{ role: "assistant", content: "This is also a long reply" },
@@ -45,11 +45,11 @@ describe("ChatMemoryBuffer", () => {
chatHistory: messages,
});
const result = buffer.getMessages();
const result = await buffer.getMessages();
expect(result).toEqual([{ role: "user", content: "Short" }]);
});
test("getMessages handles input messages", () => {
test("getMessages handles input messages", async () => {
const storedMessages: ChatMessage[] = [
{ role: "user", content: "Hello" },
{ role: "assistant", content: "Hi there!" },
@@ -62,13 +62,13 @@ describe("ChatMemoryBuffer", () => {
const inputMessages: ChatMessage[] = [
{ role: "user", content: "New message" },
];
const result = buffer.getMessages(inputMessages);
const result = await buffer.getMessages(inputMessages);
expect(result).toEqual([...inputMessages, ...storedMessages]);
});
test("getMessages throws error when initial token count exceeds limit", () => {
const buffer = new ChatMemoryBuffer({ tokenLimit: 10 });
expect(() => buffer.getMessages(undefined, 20)).toThrow(
expect(async () => buffer.getMessages(undefined, 20)).rejects.toThrow(
"Initial token count exceeds token limit",
);
});
+1 -1
View File
@@ -7,6 +7,6 @@
},
"devDependencies": {
"@llamaindex/core": "workspace:*",
"vitest": "^2.1.4"
"vitest": "^2.1.5"
}
}
+11
View File
@@ -158,4 +158,15 @@ describe("PromptTemplate", () => {
const formatted = prompt.format({ text: "world", foo: "bar" });
expect(formatted).toBe("hello world bar\noutput_instruction");
});
test("should return all unique template vars of a prompt", () => {
const prompt = new PromptTemplate({
template: "Hello {name}! Your age is {age}. Nice to meet you {name}!",
});
const vars = prompt.vars();
expect(vars).toHaveLength(2);
expect(vars).toContain("name");
expect(vars).toContain("age");
});
});
+20
View File
@@ -1,5 +1,25 @@
# @llamaindex/env
## 0.1.22
### Patch Changes
- 969365c: fix: async local storage on cloudflare worker
## 0.1.21
### Patch Changes
- 90d265c: chore: bump version
## 0.1.20
### Patch Changes
- 4fc001c: chore: bump `@huggingface/transformers`
Upgrade to v3, please read https://github.com/huggingface/transformers.js/releases/tag/3.0.0 for more information.
## 0.1.19
### Patch Changes
+6 -6
View File
@@ -1,7 +1,7 @@
{
"name": "@llamaindex/env",
"description": "environment wrapper, supports all JS environment including node, deno, bun, edge runtime, and cloudflare worker",
"version": "0.1.19",
"version": "0.1.22",
"type": "module",
"types": "dist/index.d.ts",
"module": "dist/index.js",
@@ -122,17 +122,17 @@
"test": "vitest"
},
"devDependencies": {
"@huggingface/transformers": "^3.0.2",
"@types/node": "^22.9.0",
"@types/readable-stream": "^4.0.15",
"@xenova/transformers": "^2.17.2",
"bunchee": "5.6.1",
"gpt-tokenizer": "^2.6.0",
"gpt-tokenizer": "^2.6.2",
"pathe": "^1.1.2",
"vitest": "^2.1.4"
"vitest": "^2.1.5"
},
"peerDependencies": {
"@aws-crypto/sha256-js": "^5.2.0",
"@xenova/transformers": "^2.17.2",
"@huggingface/transformers": "^3.0.2",
"gpt-tokenizer": "^2.5.0",
"js-tiktoken": "^1.0.12",
"pathe": "^1.1.2"
@@ -141,7 +141,7 @@
"@aws-crypto/sha256-js": {
"optional": true
},
"@xenova/transformers": {
"@huggingface/transformers": {
"optional": true
},
"pathe": {
+1
View File
@@ -0,0 +1 @@
export { AsyncLocalStorage } from "node:async_hooks";
+1 -1
View File
@@ -7,7 +7,7 @@
*/
import { INTERNAL_ENV } from "./utils/index.js";
export * from "./als/index.non-node.js";
export * from "./als/index.workerd.js";
export { NotSupportCurrentRuntimeClass } from "./utils/shared.js";
export * from "./node-polyfill.js";
+4 -2
View File
@@ -8,8 +8,10 @@ export {
export async function loadTransformers(onLoad: OnLoad) {
if (getTransformers() === null) {
setTransformers(
// @ts-expect-error no type
await import("https://cdn.jsdelivr.net/npm/@xenova/transformers@2.17.2"),
await import(
// @ts-expect-error no type
"https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.0.2"
),
);
} else {
return getTransformers()!;
+1 -1
View File
@@ -8,7 +8,7 @@ export {
export async function loadTransformers(onLoad: OnLoad) {
if (getTransformers() === null) {
setTransformers(await import("@xenova/transformers"));
setTransformers(await import("@huggingface/transformers"));
} else {
return getTransformers()!;
}
+4 -4
View File
@@ -9,7 +9,7 @@ export async function loadTransformers(onLoad: OnLoad) {
if (getTransformers() === null) {
/**
* If you see this warning, it means that the current environment does not support the transformer.
* because "@xeonva/transformers" highly depends on Node.js APIs.
* because "@huggingface/transformers" highly depends on Node.js APIs.
*
* One possible solution is to fix their implementation to make it work in the non-Node.js environment,
* but it's not worth the effort because Edge Runtime and Cloudflare Workers are not the for heavy Machine Learning task.
@@ -17,14 +17,14 @@ export async function loadTransformers(onLoad: OnLoad) {
* Or you can provide an RPC server that runs the transformer in a Node.js environment.
* Or you just run the code in a Node.js environment.
*
* Refs: https://github.com/xenova/transformers.js/issues/309
* Refs: https://github.com/huggingface/transformers.js/issues/309
*/
console.warn(
'"@xenova/transformers" is not officially supported in this environment, some features may not work as expected.',
'"@huggingface/transformers" is not officially supported in this environment, some features may not work as expected.',
);
setTransformers(
// @ts-expect-error no type
await import("@xenova/transformers/dist/transformers"),
await import("@huggingface/transformers/dist/transformers.js"),
);
} else {
return getTransformers()!;
+4 -4
View File
@@ -1,17 +1,17 @@
let transformer: typeof import("@xenova/transformers") | null = null;
let transformer: typeof import("@huggingface/transformers") | null = null;
export function getTransformers() {
return transformer;
}
export function setTransformers(t: typeof import("@xenova/transformers")) {
export function setTransformers(t: typeof import("@huggingface/transformers")) {
transformer = t;
}
export type OnLoad = (
transformer: typeof import("@xenova/transformers"),
transformer: typeof import("@huggingface/transformers"),
) => void;
export type LoadTransformerEvent = {
transformer: typeof import("@xenova/transformers");
transformer: typeof import("@huggingface/transformers");
};
+97
View File
@@ -1,5 +1,102 @@
# @llamaindex/experimental
## 0.0.134
### Patch Changes
- Updated dependencies [819af45]
- llamaindex@0.8.22
## 0.0.133
### Patch Changes
- Updated dependencies [83c3897]
- Updated dependencies [efa2211]
- llamaindex@0.8.21
## 0.0.132
### Patch Changes
- Updated dependencies [02b22da]
- llamaindex@0.8.20
## 0.0.131
### Patch Changes
- 90d265c: chore: bump version
- Updated dependencies [90d265c]
- llamaindex@0.8.19
## 0.0.130
### Patch Changes
- Updated dependencies [d17450f]
- llamaindex@0.8.18
## 0.0.129
### Patch Changes
- llamaindex@0.8.17
## 0.0.128
### Patch Changes
- llamaindex@0.8.16
## 0.0.127
### Patch Changes
- Updated dependencies [3d503cb]
- Updated dependencies [5dae534]
- llamaindex@0.8.15
## 0.0.126
### Patch Changes
- Updated dependencies [630b425]
- llamaindex@0.8.14
## 0.0.125
### Patch Changes
- llamaindex@0.8.13
## 0.0.124
### Patch Changes
- llamaindex@0.8.12
## 0.0.123
### Patch Changes
- llamaindex@0.8.11
## 0.0.122
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.0.121
### Patch Changes
- Updated dependencies [4fc001c]
- Updated dependencies [4d4cd8a]
- llamaindex@0.8.9
## 0.0.120
### Patch Changes

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