Compare commits

..

11 Commits

Author SHA1 Message Date
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
74 changed files with 729 additions and 175 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 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 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) [![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) [![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. 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/ Documentation: https://ts.llamaindex.ai/
+13
View File
@@ -1,5 +1,18 @@
# docs # docs
## 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 ## 0.0.116
### Patch Changes ### Patch Changes
+6
View File
@@ -62,6 +62,12 @@ const config = {
({ ({
// Replace with your project's social card // Replace with your project's social card
image: "img/favicon.png", // TODO change this 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: { navbar: {
title: "LlamaIndex.TS", title: "LlamaIndex.TS",
logo: { logo: {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "docs", "name": "docs",
"version": "0.0.116", "version": "0.0.118",
"private": true, "private": true,
"scripts": { "scripts": {
"docusaurus": "docusaurus", "docusaurus": "docusaurus",
+23
View File
@@ -1,5 +1,28 @@
# @llamaindex/doc # @llamaindex/doc
## 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 ## 0.0.14
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/doc", "name": "@llamaindex/doc",
"version": "0.0.14", "version": "0.0.16",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "pnpm run build:docs && next build", "build": "pnpm run build:docs && next build",
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

@@ -1,5 +1,11 @@
# @llamaindex/cloudflare-worker-agent-test # @llamaindex/cloudflare-worker-agent-test
## 0.0.109
### Patch Changes
- llamaindex@0.8.13
## 0.0.108 ## 0.0.108
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/cloudflare-worker-agent-test", "name": "@llamaindex/cloudflare-worker-agent-test",
"version": "0.0.108", "version": "0.0.109",
"type": "module", "type": "module",
"private": true, "private": true,
"scripts": { "scripts": {
@@ -1,5 +1,11 @@
# @llamaindex/llama-parse-browser-test # @llamaindex/llama-parse-browser-test
## 0.0.30
### Patch Changes
- @llamaindex/cloud@2.0.10
## 0.0.29 ## 0.0.29
### Patch Changes ### Patch Changes
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/llama-parse-browser-test", "name": "@llamaindex/llama-parse-browser-test",
"private": true, "private": true,
"version": "0.0.29", "version": "0.0.30",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
+6
View File
@@ -1,5 +1,11 @@
# @llamaindex/next-agent-test # @llamaindex/next-agent-test
## 0.1.109
### Patch Changes
- llamaindex@0.8.13
## 0.1.108 ## 0.1.108
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/next-agent-test", "name": "@llamaindex/next-agent-test",
"version": "0.1.108", "version": "0.1.109",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -1,5 +1,11 @@
# test-edge-runtime # test-edge-runtime
## 0.1.108
### Patch Changes
- llamaindex@0.8.13
## 0.1.107 ## 0.1.107
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/nextjs-edge-runtime-test", "name": "@llamaindex/nextjs-edge-runtime-test",
"version": "0.1.107", "version": "0.1.108",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -1,5 +1,11 @@
# @llamaindex/next-node-runtime # @llamaindex/next-node-runtime
## 0.0.90
### Patch Changes
- llamaindex@0.8.13
## 0.0.89 ## 0.0.89
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/next-node-runtime-test", "name": "@llamaindex/next-node-runtime-test",
"version": "0.0.89", "version": "0.0.90",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -1,5 +1,11 @@
# @llamaindex/waku-query-engine-test # @llamaindex/waku-query-engine-test
## 0.0.109
### Patch Changes
- llamaindex@0.8.13
## 0.0.108 ## 0.0.108
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/waku-query-engine-test", "name": "@llamaindex/waku-query-engine-test",
"version": "0.0.108", "version": "0.0.109",
"type": "module", "type": "module",
"private": true, "private": true,
"scripts": { "scripts": {
+20
View File
@@ -1,5 +1,25 @@
# examples # 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 ## 0.0.14
### Patch Changes ### 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);
+5 -5
View File
@@ -1,15 +1,15 @@
{ {
"name": "@llamaindex/examples", "name": "@llamaindex/examples",
"private": true, "private": true,
"version": "0.0.14", "version": "0.0.16",
"dependencies": { "dependencies": {
"@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/sha256-js": "^5.2.0",
"@azure/cosmos": "^4.1.1", "@azure/cosmos": "^4.1.1",
"@azure/identity": "^4.4.1", "@azure/identity": "^4.4.1",
"@datastax/astra-db-ts": "^1.4.1", "@datastax/astra-db-ts": "^1.4.1",
"@llamaindex/core": "^0.4.7", "@llamaindex/core": "^0.4.10",
"@llamaindex/readers": "^1.0.8", "@llamaindex/readers": "^1.0.11",
"@llamaindex/workflow": "^0.0.4", "@llamaindex/workflow": "^0.0.6",
"@notionhq/client": "^2.2.15", "@notionhq/client": "^2.2.15",
"@pinecone-database/pinecone": "^3.0.2", "@pinecone-database/pinecone": "^3.0.2",
"@vercel/postgres": "^0.10.0", "@vercel/postgres": "^0.10.0",
@@ -18,7 +18,7 @@
"commander": "^12.1.0", "commander": "^12.1.0",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"js-tiktoken": "^1.0.14", "js-tiktoken": "^1.0.14",
"llamaindex": "^0.8.10", "llamaindex": "^0.8.13",
"mongodb": "^6.7.0", "mongodb": "^6.7.0",
"pathe": "^1.1.2", "pathe": "^1.1.2",
"postgres": "^3.4.4" "postgres": "^3.4.4"
+6
View File
@@ -1,5 +1,11 @@
# @llamaindex/autotool # @llamaindex/autotool
## 5.0.13
### Patch Changes
- llamaindex@0.8.13
## 5.0.12 ## 5.0.12
### Patch Changes ### Patch Changes
@@ -1,5 +1,12 @@
# @llamaindex/autotool-01-node-example # @llamaindex/autotool-01-node-example
## 0.0.56
### Patch Changes
- llamaindex@0.8.13
- @llamaindex/autotool@5.0.13
## 0.0.55 ## 0.0.55
### Patch Changes ### Patch Changes
@@ -13,5 +13,5 @@
"scripts": { "scripts": {
"start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts" "start": "node --import tsx --import @llamaindex/autotool/node ./src/index.ts"
}, },
"version": "0.0.55" "version": "0.0.56"
} }
@@ -1,5 +1,12 @@
# @llamaindex/autotool-02-next-example # @llamaindex/autotool-02-next-example
## 0.1.100
### Patch Changes
- llamaindex@0.8.13
- @llamaindex/autotool@5.0.13
## 0.1.99 ## 0.1.99
### Patch Changes ### Patch Changes
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/autotool-02-next-example", "name": "@llamaindex/autotool-02-next-example",
"private": true, "private": true,
"version": "0.1.99", "version": "0.1.100",
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
"build": "next build", "build": "next build",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/autotool", "name": "@llamaindex/autotool",
"type": "module", "type": "module",
"version": "5.0.12", "version": "5.0.13",
"description": "auto transpile your JS function to LLM Agent compatible", "description": "auto transpile your JS function to LLM Agent compatible",
"files": [ "files": [
"dist", "dist",
+8
View File
@@ -1,5 +1,13 @@
# @llamaindex/cloud # @llamaindex/cloud
## 2.0.10
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 2.0.9 ## 2.0.9
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/cloud", "name": "@llamaindex/cloud",
"version": "2.0.9", "version": "2.0.10",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
+8
View File
@@ -1,5 +1,13 @@
# @llamaindex/community # @llamaindex/community
## 0.0.68
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 0.0.67 ## 0.0.67
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/community", "name": "@llamaindex/community",
"description": "Community package for LlamaIndexTS", "description": "Community package for LlamaIndexTS",
"version": "0.0.67", "version": "0.0.68",
"type": "module", "type": "module",
"types": "dist/type/index.d.ts", "types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js", "main": "dist/cjs/index.js",
+7
View File
@@ -1,5 +1,12 @@
# @llamaindex/core # @llamaindex/core
## 0.4.10
### Patch Changes
- a7b0ac3: fix: update tool call llm type
- c69605f: feat: add async support to BaseChatStore and BaseChatStoreMemory
## 0.4.9 ## 0.4.9
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/core", "name": "@llamaindex/core",
"type": "module", "type": "module",
"version": "0.4.9", "version": "0.4.10",
"description": "LlamaIndex Core Module", "description": "LlamaIndex Core Module",
"exports": { "exports": {
"./agent": { "./agent": {
+3 -1
View File
@@ -66,6 +66,8 @@ export abstract class BaseLLM<
export abstract class ToolCallLLM< export abstract class ToolCallLLM<
AdditionalChatOptions extends object = object, AdditionalChatOptions extends object = object,
> extends BaseLLM<AdditionalChatOptions, ToolCallLLMMessageOptions> { AdditionalMessageOptions extends
ToolCallLLMMessageOptions = ToolCallLLMMessageOptions,
> extends BaseLLM<AdditionalChatOptions, AdditionalMessageOptions> {
abstract supportToolCall: boolean; abstract supportToolCall: boolean;
} }
+3 -3
View File
@@ -71,15 +71,15 @@ export abstract class BaseChatStoreMemory<
return this.chatStore.getMessages(this.chatStoreKey); return this.chatStore.getMessages(this.chatStoreKey);
} }
put(messages: ChatMessage<AdditionalMessageOptions>) { put(messages: ChatMessage<AdditionalMessageOptions>): void | Promise<void> {
this.chatStore.addMessage(this.chatStoreKey, messages); this.chatStore.addMessage(this.chatStoreKey, messages);
} }
set(messages: ChatMessage<AdditionalMessageOptions>[]) { set(messages: ChatMessage<AdditionalMessageOptions>[]): void | Promise<void> {
this.chatStore.setMessages(this.chatStoreKey, messages); this.chatStore.setMessages(this.chatStoreKey, messages);
} }
reset() { reset(): void | Promise<void> {
this.chatStore.deleteMessages(this.chatStoreKey); this.chatStore.deleteMessages(this.chatStoreKey);
} }
} }
@@ -19,5 +19,7 @@ export abstract class BaseChatStore<
): void; ): void;
abstract deleteMessages(key: string): void; abstract deleteMessages(key: string): void;
abstract deleteMessage(key: string, idx: number): void; abstract deleteMessage(key: string, idx: number): void;
abstract getKeys(): IterableIterator<string>; abstract getKeys():
| IterableIterator<string>
| Promise<IterableIterator<string>>;
} }
+6
View File
@@ -1,5 +1,11 @@
# @llamaindex/experimental # @llamaindex/experimental
## 0.0.125
### Patch Changes
- llamaindex@0.8.13
## 0.0.124 ## 0.0.124
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/experimental", "name": "@llamaindex/experimental",
"description": "Experimental package for LlamaIndexTS", "description": "Experimental package for LlamaIndexTS",
"version": "0.0.124", "version": "0.0.125",
"type": "module", "type": "module",
"types": "dist/type/index.d.ts", "types": "dist/type/index.d.ts",
"main": "dist/cjs/index.js", "main": "dist/cjs/index.js",
+22
View File
@@ -1,5 +1,27 @@
# llamaindex # llamaindex
## 0.8.13
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/anthropic@0.0.19
- @llamaindex/core@0.4.10
- @llamaindex/cloud@2.0.10
- @llamaindex/node-parser@0.0.11
- @llamaindex/clip@0.0.19
- @llamaindex/deepinfra@0.0.19
- @llamaindex/huggingface@0.0.19
- @llamaindex/ollama@0.0.26
- @llamaindex/openai@0.1.35
- @llamaindex/portkey-ai@0.0.19
- @llamaindex/replicate@0.0.19
- @llamaindex/readers@1.0.11
- @llamaindex/groq@0.0.34
- @llamaindex/vllm@0.0.5
## 0.8.12 ## 0.8.12
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "llamaindex", "name": "llamaindex",
"version": "0.8.12", "version": "0.8.13",
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"keywords": [ "keywords": [
+8
View File
@@ -1,5 +1,13 @@
# @llamaindex/node-parser # @llamaindex/node-parser
## 0.0.11
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 0.0.10 ## 0.0.10
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/node-parser", "name": "@llamaindex/node-parser",
"version": "0.0.10", "version": "0.0.11",
"description": "Node parser for LlamaIndex", "description": "Node parser for LlamaIndex",
"type": "module", "type": "module",
"exports": { "exports": {
@@ -1,5 +1,14 @@
# @llamaindex/anthropic # @llamaindex/anthropic
## 0.0.19
### Patch Changes
- a7b0ac3: feat(anthropic): support prompt caching
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 0.0.18 ## 0.0.18
### Patch Changes ### Patch Changes
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/anthropic", "name": "@llamaindex/anthropic",
"description": "Anthropic Adapter for LlamaIndex", "description": "Anthropic Adapter for LlamaIndex",
"version": "0.0.18", "version": "0.0.19",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -33,7 +33,7 @@
"bunchee": "5.6.1" "bunchee": "5.6.1"
}, },
"dependencies": { "dependencies": {
"@anthropic-ai/sdk": "0.27.1", "@anthropic-ai/sdk": "0.32.1",
"@llamaindex/core": "workspace:*", "@llamaindex/core": "workspace:*",
"@llamaindex/env": "workspace:*", "@llamaindex/env": "workspace:*",
"remeda": "^2.12.0" "remeda": "^2.12.0"
+76 -23
View File
@@ -1,5 +1,9 @@
import type { ClientOptions } from "@anthropic-ai/sdk"; import type { ClientOptions } from "@anthropic-ai/sdk";
import { Anthropic as SDKAnthropic } from "@anthropic-ai/sdk"; import { Anthropic as SDKAnthropic } from "@anthropic-ai/sdk";
import type {
BetaCacheControlEphemeral,
BetaTextBlockParam,
} from "@anthropic-ai/sdk/resources/beta/index";
import type { import type {
TextBlock, TextBlock,
TextBlockParam, TextBlockParam,
@@ -8,6 +12,7 @@ import type {
ImageBlockParam, ImageBlockParam,
MessageCreateParamsNonStreaming, MessageCreateParamsNonStreaming,
MessageParam, MessageParam,
Model,
Tool, Tool,
ToolResultBlockParam, ToolResultBlockParam,
ToolUseBlock, ToolUseBlock,
@@ -75,6 +80,9 @@ export const ALL_AVAILABLE_ANTHROPIC_LEGACY_MODELS = {
"claude-2.1": { "claude-2.1": {
contextWindow: 200000, contextWindow: 200000,
}, },
"claude-2.0": {
contextWindow: 100000,
},
"claude-instant-1.2": { "claude-instant-1.2": {
contextWindow: 100000, contextWindow: 100000,
}, },
@@ -82,18 +90,30 @@ export const ALL_AVAILABLE_ANTHROPIC_LEGACY_MODELS = {
export const ALL_AVAILABLE_V3_MODELS = { export const ALL_AVAILABLE_V3_MODELS = {
"claude-3-opus": { contextWindow: 200000 }, "claude-3-opus": { contextWindow: 200000 },
"claude-3-opus-latest": { contextWindow: 200000 },
"claude-3-opus-20240229": { contextWindow: 200000 },
"claude-3-sonnet": { contextWindow: 200000 }, "claude-3-sonnet": { contextWindow: 200000 },
"claude-3-sonnet-20240229": { contextWindow: 200000 },
"claude-3-haiku": { contextWindow: 200000 }, "claude-3-haiku": { contextWindow: 200000 },
"claude-3-haiku-20240307": { contextWindow: 200000 },
}; };
export const ALL_AVAILABLE_V3_5_MODELS = { export const ALL_AVAILABLE_V3_5_MODELS = {
"claude-3-5-sonnet": { contextWindow: 200000 }, "claude-3-5-sonnet": { contextWindow: 200000 },
"claude-3-5-sonnet-20241022": { contextWindow: 200000 },
"claude-3-5-sonnet-20240620": { contextWindow: 200000 },
"claude-3-5-sonnet-latest": { contextWindow: 200000 },
"claude-3-5-haiku": { contextWindow: 200000 },
"claude-3-5-haiku-latest": { contextWindow: 200000 },
"claude-3-5-haiku-20241022": { contextWindow: 200000 },
}; };
export const ALL_AVAILABLE_ANTHROPIC_MODELS = { export const ALL_AVAILABLE_ANTHROPIC_MODELS = {
...ALL_AVAILABLE_ANTHROPIC_LEGACY_MODELS, ...ALL_AVAILABLE_ANTHROPIC_LEGACY_MODELS,
...ALL_AVAILABLE_V3_MODELS, ...ALL_AVAILABLE_V3_MODELS,
...ALL_AVAILABLE_V3_5_MODELS, ...ALL_AVAILABLE_V3_5_MODELS,
} satisfies {
[key in Model]: { contextWindow: number };
}; };
const AVAILABLE_ANTHROPIC_MODELS_WITHOUT_DATE: { [key: string]: string } = { const AVAILABLE_ANTHROPIC_MODELS_WITHOUT_DATE: { [key: string]: string } = {
@@ -104,10 +124,16 @@ const AVAILABLE_ANTHROPIC_MODELS_WITHOUT_DATE: { [key: string]: string } = {
} as { [key in keyof typeof ALL_AVAILABLE_ANTHROPIC_MODELS]: string }; } as { [key in keyof typeof ALL_AVAILABLE_ANTHROPIC_MODELS]: string };
export type AnthropicAdditionalChatOptions = object; export type AnthropicAdditionalChatOptions = object;
export type AnthropicToolCallLLMMessageOptions = ToolCallLLMMessageOptions & {
cache_control?: BetaCacheControlEphemeral | null;
};
export class Anthropic extends ToolCallLLM<AnthropicAdditionalChatOptions> { export class Anthropic extends ToolCallLLM<
AnthropicAdditionalChatOptions,
AnthropicToolCallLLMMessageOptions
> {
// Per completion Anthropic params // Per completion Anthropic params
model: keyof typeof ALL_AVAILABLE_ANTHROPIC_MODELS; model: keyof typeof ALL_AVAILABLE_ANTHROPIC_MODELS | ({} & string);
temperature: number; temperature: number;
topP: number; topP: number;
maxTokens?: number | undefined; maxTokens?: number | undefined;
@@ -147,7 +173,12 @@ export class Anthropic extends ToolCallLLM<AnthropicAdditionalChatOptions> {
temperature: this.temperature, temperature: this.temperature,
topP: this.topP, topP: this.topP,
maxTokens: this.maxTokens, maxTokens: this.maxTokens,
contextWindow: ALL_AVAILABLE_ANTHROPIC_MODELS[this.model].contextWindow, contextWindow:
this.model in ALL_AVAILABLE_ANTHROPIC_MODELS
? ALL_AVAILABLE_ANTHROPIC_MODELS[
this.model as keyof typeof ALL_AVAILABLE_ANTHROPIC_MODELS
].contextWindow
: 200000,
tokenizer: undefined, tokenizer: undefined,
}; };
} }
@@ -291,56 +322,74 @@ export class Anthropic extends ToolCallLLM<AnthropicAdditionalChatOptions> {
chat( chat(
params: LLMChatParamsStreaming< params: LLMChatParamsStreaming<
AnthropicAdditionalChatOptions, AnthropicAdditionalChatOptions,
ToolCallLLMMessageOptions AnthropicToolCallLLMMessageOptions
>, >,
): Promise<AsyncIterable<ChatResponseChunk<ToolCallLLMMessageOptions>>>; ): Promise<
AsyncIterable<ChatResponseChunk<AnthropicToolCallLLMMessageOptions>>
>;
chat( chat(
params: LLMChatParamsNonStreaming< params: LLMChatParamsNonStreaming<
AnthropicAdditionalChatOptions, AnthropicAdditionalChatOptions,
ToolCallLLMMessageOptions AnthropicToolCallLLMMessageOptions
>, >,
): Promise<ChatResponse<ToolCallLLMMessageOptions>>; ): Promise<ChatResponse<AnthropicToolCallLLMMessageOptions>>;
@wrapLLMEvent @wrapLLMEvent
async chat( async chat(
params: params:
| LLMChatParamsNonStreaming< | LLMChatParamsNonStreaming<
AnthropicAdditionalChatOptions, AnthropicAdditionalChatOptions,
ToolCallLLMMessageOptions AnthropicToolCallLLMMessageOptions
> >
| LLMChatParamsStreaming< | LLMChatParamsStreaming<
AnthropicAdditionalChatOptions, AnthropicAdditionalChatOptions,
ToolCallLLMMessageOptions AnthropicToolCallLLMMessageOptions
>, >,
): Promise< ): Promise<
| ChatResponse<ToolCallLLMMessageOptions> | ChatResponse<AnthropicToolCallLLMMessageOptions>
| AsyncIterable<ChatResponseChunk<ToolCallLLMMessageOptions>> | AsyncIterable<ChatResponseChunk<AnthropicToolCallLLMMessageOptions>>
> { > {
let { messages } = params; let { messages } = params;
const { stream, tools } = params; const { stream, tools } = params;
let systemPrompt: string | null = null; let systemPrompt: string | Array<BetaTextBlockParam> | null = null;
const systemMessages = messages.filter( const systemMessages = messages.filter(
(message) => message.role === "system", (message) => message.role === "system",
); );
if (systemMessages.length > 0) { if (systemMessages.length > 0) {
systemPrompt = systemMessages systemPrompt = systemMessages.map((message) =>
.map((message) => message.content) message.options && "cache_control" in message.options
.join("\n"); ? {
type: "text",
text: extractText(message.content),
cache_control: message.options.cache_control,
}
: {
type: "text",
text: extractText(message.content),
},
);
messages = messages.filter((message) => message.role !== "system"); messages = messages.filter((message) => message.role !== "system");
} }
const beta =
systemPrompt?.find((message) => "cache_control" in message) !== undefined;
// case: Non-streaming
let anthropic = this.session.anthropic;
if (beta) {
// @ts-expect-error type casting
anthropic = anthropic.beta.promptCaching;
}
// case: Streaming // case: Streaming
if (stream) { if (stream) {
if (tools) { if (tools) {
console.error("Tools are not supported in streaming mode"); console.error("Tools are not supported in streaming mode");
} }
return this.streamChat(messages, systemPrompt); return this.streamChat(messages, systemPrompt, anthropic);
} }
// case: Non-streaming
const anthropic = this.session.anthropic;
if (tools) { if (tools) {
const params: MessageCreateParamsNonStreaming = { const params: MessageCreateParamsNonStreaming = {
@@ -378,7 +427,10 @@ export class Anthropic extends ToolCallLLM<AnthropicAdditionalChatOptions> {
toolCall: toolUseBlock.map((block) => ({ toolCall: toolUseBlock.map((block) => ({
id: block.id, id: block.id,
name: block.name, name: block.name,
input: block.input, input:
typeof block.input === "object"
? JSON.stringify(block.input)
: `${block.input}`,
})), })),
} }
: {}, : {},
@@ -411,10 +463,11 @@ export class Anthropic extends ToolCallLLM<AnthropicAdditionalChatOptions> {
} }
protected async *streamChat( protected async *streamChat(
messages: ChatMessage<ToolCallLLMMessageOptions>[], messages: ChatMessage<AnthropicToolCallLLMMessageOptions>[],
systemPrompt?: string | null, systemPrompt: string | Array<BetaTextBlockParam> | null,
): AsyncIterable<ChatResponseChunk<ToolCallLLMMessageOptions>> { anthropic: SDKAnthropic,
const stream = await this.session.anthropic.messages.create({ ): AsyncIterable<ChatResponseChunk<AnthropicToolCallLLMMessageOptions>> {
const stream = await anthropic.messages.create({
model: this.getModelName(this.model), model: this.getModelName(this.model),
messages: this.formatMessages(messages), messages: this.formatMessages(messages),
max_tokens: this.maxTokens ?? 4096, max_tokens: this.maxTokens ?? 4096,
+9
View File
@@ -1,5 +1,14 @@
# @llamaindex/clip # @llamaindex/clip
## 0.0.19
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
- @llamaindex/openai@0.1.35
## 0.0.18 ## 0.0.18
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/clip", "name": "@llamaindex/clip",
"description": "Clip Embedding Adapter for LlamaIndex", "description": "Clip Embedding Adapter for LlamaIndex",
"version": "0.0.18", "version": "0.0.19",
"type": "module", "type": "module",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"main": "dist/index.cjs", "main": "dist/index.cjs",
@@ -1,5 +1,14 @@
# @llamaindex/deepinfra # @llamaindex/deepinfra
## 0.0.19
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
- @llamaindex/openai@0.1.35
## 0.0.18 ## 0.0.18
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/deepinfra", "name": "@llamaindex/deepinfra",
"description": "Deepinfra Adapter for LlamaIndex", "description": "Deepinfra Adapter for LlamaIndex",
"version": "0.0.18", "version": "0.0.19",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
+6
View File
@@ -1,5 +1,11 @@
# @llamaindex/groq # @llamaindex/groq
## 0.0.34
### Patch Changes
- @llamaindex/openai@0.1.35
## 0.0.33 ## 0.0.33
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/groq", "name": "@llamaindex/groq",
"description": "Groq Adapter for LlamaIndex", "description": "Groq Adapter for LlamaIndex",
"version": "0.0.33", "version": "0.0.34",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -1,5 +1,14 @@
# @llamaindex/huggingface # @llamaindex/huggingface
## 0.0.19
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
- @llamaindex/openai@0.1.35
## 0.0.18 ## 0.0.18
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/huggingface", "name": "@llamaindex/huggingface",
"description": "Huggingface Adapter for LlamaIndex", "description": "Huggingface Adapter for LlamaIndex",
"version": "0.0.18", "version": "0.0.19",
"type": "module", "type": "module",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"main": "dist/index.cjs", "main": "dist/index.cjs",
+8
View File
@@ -1,5 +1,13 @@
# @llamaindex/ollama # @llamaindex/ollama
## 0.0.26
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 0.0.25 ## 0.0.25
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/ollama", "name": "@llamaindex/ollama",
"description": "Ollama Adapter for LlamaIndex", "description": "Ollama Adapter for LlamaIndex",
"version": "0.0.25", "version": "0.0.26",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
+8
View File
@@ -1,5 +1,13 @@
# @llamaindex/openai # @llamaindex/openai
## 0.1.35
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 0.1.34 ## 0.1.34
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/openai", "name": "@llamaindex/openai",
"description": "OpenAI Adapter for LlamaIndex", "description": "OpenAI Adapter for LlamaIndex",
"version": "0.1.34", "version": "0.1.35",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -1,5 +1,13 @@
# @llamaindex/portkey-ai # @llamaindex/portkey-ai
## 0.0.19
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 0.0.18 ## 0.0.18
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/portkey-ai", "name": "@llamaindex/portkey-ai",
"description": "Portkey Adapter for LlamaIndex", "description": "Portkey Adapter for LlamaIndex",
"version": "0.0.18", "version": "0.0.19",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -1,5 +1,13 @@
# @llamaindex/replicate # @llamaindex/replicate
## 0.0.19
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 0.0.18 ## 0.0.18
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/replicate", "name": "@llamaindex/replicate",
"description": "Replicate Adapter for LlamaIndex", "description": "Replicate Adapter for LlamaIndex",
"version": "0.0.18", "version": "0.0.19",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
+6
View File
@@ -1,5 +1,11 @@
# @llamaindex/vllm # @llamaindex/vllm
## 0.0.5
### Patch Changes
- @llamaindex/openai@0.1.35
## 0.0.4 ## 0.0.4
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/vllm", "name": "@llamaindex/vllm",
"description": "vLLM Adapter for LlamaIndex", "description": "vLLM Adapter for LlamaIndex",
"version": "0.0.4", "version": "0.0.5",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
+8
View File
@@ -1,5 +1,13 @@
# @llamaindex/readers # @llamaindex/readers
## 1.0.11
### Patch Changes
- Updated dependencies [a7b0ac3]
- Updated dependencies [c69605f]
- @llamaindex/core@0.4.10
## 1.0.10 ## 1.0.10
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/readers", "name": "@llamaindex/readers",
"description": "LlamaIndex Readers", "description": "LlamaIndex Readers",
"version": "1.0.10", "version": "1.0.11",
"type": "module", "type": "module",
"exports": { "exports": {
"./node/hook": "./node/dist/hook.js", "./node/hook": "./node/dist/hook.js",
+13
View File
@@ -1,5 +1,18 @@
# @llamaindex/workflow # @llamaindex/workflow
## 0.0.6
### Patch Changes
- ee20c44: feat(workflow): allow send event with no output
## 0.0.5
### Patch Changes
- ea92b69: fix: output event check
- fadc8b8: feat: recoverable context with error handling
## 0.0.4 ## 0.0.4
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/workflow", "name": "@llamaindex/workflow",
"description": "Workflow API", "description": "Workflow API",
"version": "0.0.4", "version": "0.0.6",
"type": "module", "type": "module",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"module": "dist/index.js", "module": "dist/index.js",
+106 -95
View File
@@ -13,19 +13,18 @@ export type StepHandler<
AnyWorkflowEventConstructor | StartEventConstructor, AnyWorkflowEventConstructor | StartEventConstructor,
...(AnyWorkflowEventConstructor | StopEventConstructor)[], ...(AnyWorkflowEventConstructor | StopEventConstructor)[],
] = [AnyWorkflowEventConstructor | StartEventConstructor], ] = [AnyWorkflowEventConstructor | StartEventConstructor],
Out extends [ Out extends (AnyWorkflowEventConstructor | StopEventConstructor)[] = [],
AnyWorkflowEventConstructor | StartEventConstructor,
...(AnyWorkflowEventConstructor | StopEventConstructor)[],
] = [AnyWorkflowEventConstructor | StopEventConstructor],
> = ( > = (
context: HandlerContext<Data>, context: HandlerContext<Data>,
...events: { ...events: {
[K in keyof Inputs]: InstanceType<Inputs[K]>; [K in keyof Inputs]: InstanceType<Inputs[K]>;
} }
) => Promise< ) => Promise<
{ Out extends []
[K in keyof Out]: InstanceType<Out[K]>; ? void
}[number] : {
[K in keyof Out]: InstanceType<Out[K]>;
}[number]
>; >;
export type ReadonlyStepMap<Data> = ReadonlyMap< export type ReadonlyStepMap<Data> = ReadonlyMap<
@@ -275,7 +274,7 @@ export class WorkflowContext<Start = string, Stop = string, Data = unknown>
*/ */
#createStreamEvents(): AsyncIterableIterator<WorkflowEvent<unknown>> { #createStreamEvents(): AsyncIterableIterator<WorkflowEvent<unknown>> {
const isPendingEvents = new WeakSet<WorkflowEvent<unknown>>(); const isPendingEvents = new WeakSet<WorkflowEvent<unknown>>();
const pendingTasks = new Set<Promise<WorkflowEvent<unknown>>>(); const pendingTasks = new Set<Promise<WorkflowEvent<unknown> | void>>();
const enqueuedEvents = new Set<WorkflowEvent<unknown>>(); const enqueuedEvents = new Set<WorkflowEvent<unknown>>();
const stream = new ReadableStream<WorkflowEvent<unknown>>({ const stream = new ReadableStream<WorkflowEvent<unknown>>({
start: async (controller) => { start: async (controller) => {
@@ -325,101 +324,104 @@ export class WorkflowContext<Start = string, Stop = string, Data = unknown>
} }
const [steps, inputsMap, outputsMap] = const [steps, inputsMap, outputsMap] =
this.#getStepFunction(event); this.#getStepFunction(event);
const nextEventPromises: Promise<WorkflowEvent<unknown>>[] = [ const nextEventPromises: Promise<WorkflowEvent<unknown> | void>[] =
...steps, [...steps]
] .map((step) => {
.map((step) => { const inputs = [...(inputsMap.get(step) ?? [])];
const inputs = [...(inputsMap.get(step) ?? [])]; const acceptableInputs: WorkflowEvent<unknown>[] =
const acceptableInputs: WorkflowEvent<unknown>[] = this.#pendingInputQueue.filter((event) =>
this.#pendingInputQueue.filter((event) => inputs.some((input) => event instanceof input),
inputs.some((input) => event instanceof input),
);
const events: WorkflowEvent<unknown>[] = flattenEvents(
inputs,
[event, ...acceptableInputs],
);
// remove the event from the queue, in case of infinite loop
events.forEach((event) => {
const protocolIdx = this.#queue.findIndex(
(protocol) =>
protocol.type === "event" &&
protocol.event === event,
);
if (protocolIdx !== -1) {
this.#queue.splice(protocolIdx, 1);
}
});
if (events.length !== inputs.length) {
if (this.#verbose) {
console.log(
`Not enough inputs for step ${step.name}, waiting for more events`,
); );
} const events: WorkflowEvent<unknown>[] = flattenEvents(
// not enough to run the step, push back to the queue inputs,
this.#sendEvent(event); [event, ...acceptableInputs],
isPendingEvents.add(event);
return null;
}
if (isPendingEvents.has(event)) {
isPendingEvents.delete(event);
}
if (this.#verbose) {
console.log(
`Running step ${step.name} with inputs ${events}`,
); );
} // remove the event from the queue, in case of infinite loop
const data = this.data; events.forEach((event) => {
return (step as StepHandler<Data>) const protocolIdx = this.#queue.findIndex(
.call( (protocol) =>
null, protocol.type === "event" &&
{ protocol.event === event,
get data() { );
return data; if (protocolIdx !== -1) {
}, this.#queue.splice(protocolIdx, 1);
sendEvent: this.#sendEvent, }
requireEvent: this.#requireEvent, });
}, if (events.length !== inputs.length) {
// @ts-expect-error IDK why
...events.sort((a, b) => {
const aIndex = inputs.indexOf(
a.constructor as AnyWorkflowEventConstructor,
);
const bIndex = inputs.indexOf(
b.constructor as AnyWorkflowEventConstructor,
);
return aIndex - bIndex;
}),
)
.then((nextEvent) => {
if (this.#verbose) { if (this.#verbose) {
console.log( console.log(
`Step ${step.name} completed, next event is ${nextEvent}`, `Not enough inputs for step ${step.name}, waiting for more events`,
); );
} }
const outputs = outputsMap.get(step) ?? []; // not enough to run the step, push back to the queue
const outputEvents = flattenEvents(outputs, [ this.#sendEvent(event);
nextEvent, isPendingEvents.add(event);
]); return null;
if (outputEvents.length !== outputs.length) { }
if (this.#strict) { if (isPendingEvents.has(event)) {
const error = Error( isPendingEvents.delete(event);
`Step ${step.name} returned an unexpected output event ${nextEvent}`, }
if (this.#verbose) {
console.log(
`Running step ${step.name} with inputs ${events}`,
);
}
const data = this.data;
return (step as StepHandler<Data>)
.call(
null,
{
get data() {
return data;
},
sendEvent: this.#sendEvent,
requireEvent: this.#requireEvent,
},
// @ts-expect-error IDK why
...events.sort((a, b) => {
const aIndex = inputs.indexOf(
a.constructor as AnyWorkflowEventConstructor,
); );
controller.error(error); const bIndex = inputs.indexOf(
} else { b.constructor as AnyWorkflowEventConstructor,
console.warn( );
`Step ${step.name} returned an unexpected output event ${nextEvent}`, return aIndex - bIndex;
}),
)
.then((nextEvent: void | WorkflowEvent<unknown>) => {
if (nextEvent === undefined) {
return;
}
if (this.#verbose) {
console.log(
`Step ${step.name} completed, next event is ${nextEvent}`,
); );
} }
} const outputs = outputsMap.get(step) ?? [];
if (!(nextEvent instanceof StopEvent)) { if (
this.#pendingInputQueue.unshift(nextEvent); !outputs.some(
this.#sendEvent(nextEvent); (output) => nextEvent.constructor === output,
} )
return nextEvent; ) {
}); if (this.#strict) {
}) const error = Error(
.filter((promise) => promise !== null); `Step ${step.name} returned an unexpected output event ${nextEvent}`,
);
controller.error(error);
} else {
console.warn(
`Step ${step.name} returned an unexpected output event ${nextEvent}`,
);
}
}
if (!(nextEvent instanceof StopEvent)) {
this.#pendingInputQueue.unshift(nextEvent);
this.#sendEvent(nextEvent);
}
return nextEvent;
});
})
.filter((promise) => promise !== null);
nextEventPromises.forEach((promise) => { nextEventPromises.forEach((promise) => {
pendingTasks.add(promise); pendingTasks.add(promise);
promise promise
@@ -432,6 +434,9 @@ export class WorkflowContext<Start = string, Stop = string, Data = unknown>
}); });
Promise.race(nextEventPromises) Promise.race(nextEventPromises)
.then((fastestNextEvent) => { .then((fastestNextEvent) => {
if (fastestNextEvent === undefined) {
return;
}
if (!enqueuedEvents.has(fastestNextEvent)) { if (!enqueuedEvents.has(fastestNextEvent)) {
controller.enqueue(fastestNextEvent); controller.enqueue(fastestNextEvent);
enqueuedEvents.add(fastestNextEvent); enqueuedEvents.add(fastestNextEvent);
@@ -440,7 +445,10 @@ export class WorkflowContext<Start = string, Stop = string, Data = unknown>
}) })
.then(async (fastestNextEvent) => .then(async (fastestNextEvent) =>
Promise.all(nextEventPromises).then((nextEvents) => { Promise.all(nextEventPromises).then((nextEvents) => {
for (const nextEvent of nextEvents) { const events = nextEvents.filter(
(event) => event !== undefined,
);
for (const nextEvent of events) {
// do not enqueue the same event twice // do not enqueue the same event twice
if (fastestNextEvent !== nextEvent) { if (fastestNextEvent !== nextEvent) {
if (!enqueuedEvents.has(nextEvent)) { if (!enqueuedEvents.has(nextEvent)) {
@@ -452,6 +460,9 @@ export class WorkflowContext<Start = string, Stop = string, Data = unknown>
}), }),
) )
.catch((err) => { .catch((err) => {
// when the step raise an error, should go back to the previous step
this.#sendEvent(event);
isPendingEvents.add(event);
controller.error(err); controller.error(err);
}); });
} }
+6 -7
View File
@@ -57,10 +57,7 @@ export class Workflow<ContextData, Start, Stop> {
AnyWorkflowEventConstructor | StartEventConstructor, AnyWorkflowEventConstructor | StartEventConstructor,
...(AnyWorkflowEventConstructor | StopEventConstructor)[], ...(AnyWorkflowEventConstructor | StopEventConstructor)[],
], ],
const Out extends [ const Out extends (AnyWorkflowEventConstructor | StopEventConstructor)[],
AnyWorkflowEventConstructor | StopEventConstructor,
...(AnyWorkflowEventConstructor | StopEventConstructor)[],
],
>( >(
parameters: StepParameters<In, Out>, parameters: StepParameters<In, Out>,
stepFn: ( stepFn: (
@@ -69,9 +66,11 @@ export class Workflow<ContextData, Start, Stop> {
[K in keyof In]: InstanceType<In[K]>; [K in keyof In]: InstanceType<In[K]>;
} }
) => Promise< ) => Promise<
{ Out extends []
[K in keyof Out]: InstanceType<Out[K]>; ? void
}[number] : {
[K in keyof Out]: InstanceType<Out[K]>;
}[number]
>, >,
): this { ): this {
const { inputs, outputs } = parameters; const { inputs, outputs } = parameters;
+21 -6
View File
@@ -584,13 +584,13 @@ importers:
specifier: ^1.4.1 specifier: ^1.4.1
version: 1.5.0 version: 1.5.0
'@llamaindex/core': '@llamaindex/core':
specifier: ^0.4.7 specifier: ^0.4.10
version: link:../packages/core version: link:../packages/core
'@llamaindex/readers': '@llamaindex/readers':
specifier: ^1.0.8 specifier: ^1.0.11
version: link:../packages/readers version: link:../packages/readers
'@llamaindex/workflow': '@llamaindex/workflow':
specifier: ^0.0.4 specifier: ^0.0.6
version: link:../packages/workflow version: link:../packages/workflow
'@notionhq/client': '@notionhq/client':
specifier: ^2.2.15 specifier: ^2.2.15
@@ -617,7 +617,7 @@ importers:
specifier: ^1.0.14 specifier: ^1.0.14
version: 1.0.15 version: 1.0.15
llamaindex: llamaindex:
specifier: ^0.8.10 specifier: ^0.8.13
version: link:../packages/llamaindex version: link:../packages/llamaindex
mongodb: mongodb:
specifier: ^6.7.0 specifier: ^6.7.0
@@ -1191,8 +1191,8 @@ importers:
packages/providers/anthropic: packages/providers/anthropic:
dependencies: dependencies:
'@anthropic-ai/sdk': '@anthropic-ai/sdk':
specifier: 0.27.1 specifier: 0.32.1
version: 0.27.1(encoding@0.1.13) version: 0.32.1(encoding@0.1.13)
'@llamaindex/core': '@llamaindex/core':
specifier: workspace:* specifier: workspace:*
version: link:../../core version: link:../../core
@@ -1701,6 +1701,9 @@ packages:
'@anthropic-ai/sdk@0.27.1': '@anthropic-ai/sdk@0.27.1':
resolution: {integrity: sha512-AKFd/E8HO26+DOVPiZpEked3Pm2feA5d4gcX2FcJXr9veDkXbKO90hr2C7N2TL7mPIMwm040ldXlsIZQ416dHg==} resolution: {integrity: sha512-AKFd/E8HO26+DOVPiZpEked3Pm2feA5d4gcX2FcJXr9veDkXbKO90hr2C7N2TL7mPIMwm040ldXlsIZQ416dHg==}
'@anthropic-ai/sdk@0.32.1':
resolution: {integrity: sha512-U9JwTrDvdQ9iWuABVsMLj8nJVwAyQz6QXvgLsVhryhCEPkLsbcP/MXxm+jYcAwLoV8ESbaTTjnD4kuAFa+Hyjg==}
'@apidevtools/json-schema-ref-parser@11.7.2': '@apidevtools/json-schema-ref-parser@11.7.2':
resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==}
engines: {node: '>= 16'} engines: {node: '>= 16'}
@@ -13425,6 +13428,18 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
'@anthropic-ai/sdk@0.32.1(encoding@0.1.13)':
dependencies:
'@types/node': 18.19.64
'@types/node-fetch': 2.6.11
abort-controller: 3.0.0
agentkeepalive: 4.5.0
form-data-encoder: 1.7.2
formdata-node: 4.4.1
node-fetch: 2.7.0(encoding@0.1.13)
transitivePeerDependencies:
- encoding
'@apidevtools/json-schema-ref-parser@11.7.2': '@apidevtools/json-schema-ref-parser@11.7.2':
dependencies: dependencies:
'@jsdevtools/ono': 7.1.3 '@jsdevtools/ono': 7.1.3
+24
View File
@@ -1,5 +1,29 @@
# @llamaindex/unit-test # @llamaindex/unit-test
## 0.0.23
### Patch Changes
- ee20c44: feat(workflow): allow send event with no output
- 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.22
### Patch Changes
- Updated dependencies [ea92b69]
- Updated dependencies [fadc8b8]
- @llamaindex/workflow@0.0.5
## 0.0.21 ## 0.0.21
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/unit-test", "name": "@llamaindex/unit-test",
"private": true, "private": true,
"version": "0.0.21", "version": "0.0.23",
"type": "module", "type": "module",
"scripts": { "scripts": {
"test": "vitest run" "test": "vitest run"
+110
View File
@@ -531,6 +531,21 @@ describe("workflow basic", () => {
const result = await myWorkflow.run("start"); const result = await myWorkflow.run("start");
expect(result.data).toBe("query result"); expect(result.data).toBe("query result");
}); });
test("allow output with send event", async () => {
const myFlow = new Workflow<unknown, string, string>({ verbose: true });
myFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [],
},
async (context, ev) => {
context.sendEvent(new StopEvent(`Hello ${ev.data}!`));
},
);
const result = myFlow.run("world");
expect((await result).data).toBe("Hello world!");
});
}); });
describe("workflow event loop", () => { describe("workflow event loop", () => {
@@ -794,6 +809,21 @@ describe("workflow event loop", () => {
} }
`); `);
}); });
test("workflow multiple output", async () => {
const myFlow = new Workflow<unknown, string, string>({ verbose: true });
myFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [StopEvent<string>, StopEvent<string>],
},
async (_context, ev) => {
return new StopEvent(`Hello ${ev.data}!`);
},
);
const result = await myFlow.run("world").strict();
expect(result.data).toBe("Hello world!");
});
}); });
describe("snapshot", async () => { describe("snapshot", async () => {
@@ -869,3 +899,83 @@ describe("snapshot", async () => {
expect(fn).toHaveBeenCalledTimes(1); expect(fn).toHaveBeenCalledTimes(1);
}); });
}); });
describe("error", () => {
test("error in handler", async () => {
const myFlow = new Workflow<boolean, string, string>({ verbose: true });
myFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [StopEvent<string>],
},
async ({ data }) => {
if (!data) {
throw new Error("Something went wrong");
} else {
return new StopEvent(`Hello ${data}!`);
}
},
);
await expect(myFlow.run("world")).rejects.toThrow("Something went wrong");
{
const context = myFlow.run("world");
try {
for await (const _ of context) {
// do nothing
}
} catch (error) {
expect(error).toBeInstanceOf(Error);
expect((error as Error).message).toBe("Something went wrong");
const snapshot = context.snapshot();
const newContext = myFlow.recover(snapshot).with(true);
expect((await newContext).data).toBe("Hello true!");
}
}
});
test("recover in the middle of workflow", async () => {
const myFlow = new Workflow<string | undefined, string, string>({
verbose: true,
});
class AEvent extends WorkflowEvent<string> {}
myFlow.addStep(
{
inputs: [StartEvent<string>],
outputs: [AEvent],
},
async ({ data }) => {
if (data !== undefined) {
throw new Error("Something went wrong");
}
return new AEvent("world");
},
);
myFlow.addStep(
{
inputs: [AEvent],
outputs: [StopEvent],
},
async ({ data }, ev) => {
if (data === undefined) {
throw new Error("Something went wrong");
}
return new StopEvent(`Hello, ${data}!`);
},
);
// no context, so will throw error
const context = myFlow.run("world");
try {
for await (const _ of context) {
// do nothing
}
} catch (error) {
expect(error).toBeInstanceOf(Error);
expect((error as Error).message).toBe("Something went wrong");
const snapshot = context.snapshot();
const newContext = myFlow.recover(snapshot).with("Recovered Data");
expect((await newContext).data).toBe("Hello, Recovered Data!");
}
});
});