Compare commits

..

8 Commits

Author SHA1 Message Date
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
86 changed files with 996 additions and 177 deletions
+14
View File
@@ -1,5 +1,19 @@
# docs # docs
## 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 ## 0.0.113
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "docs", "name": "docs",
"version": "0.0.113", "version": "0.0.115",
"private": true, "private": true,
"scripts": { "scripts": {
"docusaurus": "docusaurus", "docusaurus": "docusaurus",
+28
View File
@@ -1,5 +1,33 @@
# @llamaindex/doc # @llamaindex/doc
## 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 ## 0.0.11
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/doc", "name": "@llamaindex/doc",
"version": "0.0.11", "version": "0.0.13",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "pnpm run build:docs && next build", "build": "pnpm run build:docs && next build",
+8
View File
@@ -1,6 +1,14 @@
{ {
"extends": ["//"], "extends": ["//"],
"tasks": { "tasks": {
"build": {
"outputs": [
".next",
".source",
"next-env.d.ts",
"src/content/docs/cloud/api/**"
]
},
"dev": { "dev": {
"dependsOn": ["^build"] "dependsOn": ["^build"]
} }
@@ -1,5 +1,18 @@
# @llamaindex/cloudflare-worker-agent-test # @llamaindex/cloudflare-worker-agent-test
## 0.0.107
### Patch Changes
- llamaindex@0.8.11
## 0.0.106
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.0.105 ## 0.0.105
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/cloudflare-worker-agent-test", "name": "@llamaindex/cloudflare-worker-agent-test",
"version": "0.0.105", "version": "0.0.107",
"type": "module", "type": "module",
"private": true, "private": true,
"scripts": { "scripts": {
@@ -1,5 +1,17 @@
# @llamaindex/llama-parse-browser-test # @llamaindex/llama-parse-browser-test
## 0.0.28
### Patch Changes
- @llamaindex/cloud@2.0.8
## 0.0.27
### Patch Changes
- @llamaindex/cloud@2.0.7
## 0.0.26 ## 0.0.26
### 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.26", "version": "0.0.28",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
+13
View File
@@ -1,5 +1,18 @@
# @llamaindex/next-agent-test # @llamaindex/next-agent-test
## 0.1.107
### Patch Changes
- llamaindex@0.8.11
## 0.1.106
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.1.105 ## 0.1.105
### 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.105", "version": "0.1.107",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -1,5 +1,18 @@
# test-edge-runtime # test-edge-runtime
## 0.1.106
### Patch Changes
- llamaindex@0.8.11
## 0.1.105
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.1.104 ## 0.1.104
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/nextjs-edge-runtime-test", "name": "@llamaindex/nextjs-edge-runtime-test",
"version": "0.1.104", "version": "0.1.106",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -1,5 +1,18 @@
# @llamaindex/next-node-runtime # @llamaindex/next-node-runtime
## 0.0.88
### Patch Changes
- llamaindex@0.8.11
## 0.0.87
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.0.86 ## 0.0.86
### Patch Changes ### Patch Changes
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/next-node-runtime-test", "name": "@llamaindex/next-node-runtime-test",
"version": "0.0.86", "version": "0.0.88",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
@@ -1,5 +1,18 @@
# @llamaindex/waku-query-engine-test # @llamaindex/waku-query-engine-test
## 0.0.107
### Patch Changes
- llamaindex@0.8.11
## 0.0.106
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.0.105 ## 0.0.105
### 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.105", "version": "0.0.107",
"type": "module", "type": "module",
"private": true, "private": true,
"scripts": { "scripts": {
+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 }) => { const mockCall = t.mock.fn(({ query }: { query: string }) => {
return originalCall({ query }); return originalCall({ query });
}); });
// @ts-expect-error what?
queryEngineTools[1]!.call = mockCall; queryEngineTools[1]!.call = mockCall;
const toolMapping = SimpleToolNodeMapping.fromObjects(queryEngineTools); const toolMapping = SimpleToolNodeMapping.fromObjects(queryEngineTools);
+13
View File
@@ -1,5 +1,18 @@
# examples # examples
## 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 ## 0.0.13
### Patch Changes ### Patch Changes
+5 -5
View File
@@ -1,15 +1,15 @@
{ {
"name": "@llamaindex/examples", "name": "@llamaindex/examples",
"private": true, "private": true,
"version": "0.0.13", "version": "0.0.14",
"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.5", "@llamaindex/core": "^0.4.7",
"@llamaindex/readers": "^1.0.6", "@llamaindex/readers": "^1.0.8",
"@llamaindex/workflow": "^0.0.3", "@llamaindex/workflow": "^0.0.4",
"@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.8", "llamaindex": "^0.8.10",
"mongodb": "^6.7.0", "mongodb": "^6.7.0",
"pathe": "^1.1.2", "pathe": "^1.1.2",
"postgres": "^3.4.4" "postgres": "^3.4.4"
+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 { import {
Context, HandlerContext,
StartEvent, StartEvent,
StopEvent, StopEvent,
Workflow, Workflow,
WorkflowEvent, WorkflowEvent,
} from "@llamaindex/core/workflow"; } from "@llamaindex/workflow";
import { OpenAI } from "llamaindex"; import { OpenAI } from "llamaindex";
const MAX_REVIEWS = 3; 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) // 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 }); 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 // Create custom event types
export class MessageEvent extends WorkflowEvent<{ msg: string }> {} export class MessageEvent extends WorkflowEvent<{ msg: string }> {}
export class CodeEvent extends WorkflowEvent<{ code: string }> {} export class CodeEvent extends WorkflowEvent<{ code: string }> {}
export class ReviewEvent extends WorkflowEvent<{ export class ReviewEvent extends WorkflowEvent<{
review: string; review: string;
code: 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 // the architect is responsible for writing the structure and the initial code based on the specification
const architect = async (context: Context, ev: StartEvent) => { const architect = async (
// get the specification from the start event and save it to context context: HandlerContext<Context>,
context.set("specification", ev.data.input); _: StartEvent<string>,
const spec = context.get("specification"); ) => {
const spec = context.data.specification;
// write a message to send an update to the user // write a message to send an update to the user
context.writeEventToStream( context.sendEvent(
new MessageEvent({ new MessageEvent({
msg: `Writing app using this specification: ${truncate(spec)}`, 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 // 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 // get the specification from the context
const spec = context.get("specification"); const spec = context.data.specification;
// get the latest review and code // get the latest review and code
const { review, code } = ev.data; const { review, code } = ev.data;
// write a message to send an update to the user // write a message to send an update to the user
context.writeEventToStream( context.sendEvent(
new MessageEvent({ new MessageEvent({
msg: `Update code based on review: ${truncate(review)}`, 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 // 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 // get the specification from the context
const spec = context.get("specification"); const spec = context.data.specification;
// get latest code from the event // get latest code from the event
const { code } = ev.data; const { code } = ev.data;
// update and check the number of reviews // update and check the number of reviews
const numberReviews = context.get("numberReviews", 0) + 1; context.data.numberReviews++;
context.set("numberReviews", numberReviews); if (context.data.numberReviews > MAX_REVIEWS) {
if (numberReviews > MAX_REVIEWS) {
// the we've done this too many times - return the code // the we've done this too many times - return the code
context.writeEventToStream( context.sendEvent(
new MessageEvent({ new MessageEvent({
msg: `Already reviewed ${numberReviews - 1} times, stopping!`, msg: `Already reviewed ${
context.data.numberReviews - 1
} times, stopping!`,
}), }),
); );
return new StopEvent({ result: code }); return new StopEvent({ result: code });
} }
// write a message to send an update to the user // write a message to send an update to the user
context.writeEventToStream( context.sendEvent(
new MessageEvent({ msg: `Review #${numberReviews}: ${truncate(code)}` }), 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 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; const review = (await llm.complete({ prompt })).text;
if (review.includes("Looks great")) { if (review.includes("Looks great")) {
// the reviewer is satisfied with the code, let's return the review // the reviewer is satisfied with the code, let's return the review
context.writeEventToStream( context.sendEvent(
new MessageEvent({ new MessageEvent({
msg: `Reviewer says: ${review}`, msg: `Reviewer says: ${review}`,
}), }),
@@ -103,20 +114,44 @@ const reviewer = async (context: Context, ev: CodeEvent) => {
return new ReviewEvent({ review, code }); return new ReviewEvent({ review, code });
}; };
const codeAgent = new Workflow({ validate: true }); const codeAgent = new Workflow<Context, string, string>();
codeAgent.addStep(StartEvent, architect, { outputs: CodeEvent }); codeAgent.addStep(
codeAgent.addStep(ReviewEvent, coder, { outputs: CodeEvent }); {
codeAgent.addStep(CodeEvent, reviewer, { outputs: ReviewEvent }); inputs: [StartEvent<string>],
outputs: [CodeEvent],
},
architect,
);
codeAgent.addStep(
{
inputs: [ReviewEvent],
outputs: [CodeEvent],
},
coder,
);
codeAgent.addStep(
{
inputs: [CodeEvent],
outputs: [ReviewEvent, StopEvent],
},
reviewer,
);
// Usage // Usage
async function main() { async function main() {
const run = codeAgent.run(specification); const run = codeAgent.run(specification).with({
for await (const event of codeAgent.streamEvents()) { specification,
const msg = (event as MessageEvent).data.msg; numberReviews: 0,
console.log(`${msg}\n`); });
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); main().catch(console.error);
@@ -1,10 +1,10 @@
import { import {
Context, HandlerContext,
StartEvent, StartEvent,
StopEvent, StopEvent,
Workflow, Workflow,
WorkflowEvent, WorkflowEvent,
} from "@llamaindex/core/workflow"; } from "@llamaindex/workflow";
import { OpenAI } from "llamaindex"; import { OpenAI } from "llamaindex";
// Create LLM instance // Create LLM instance
@@ -12,59 +12,77 @@ const llm = new OpenAI();
// Create custom event types // Create custom event types
export class JokeEvent extends WorkflowEvent<{ joke: string }> {} export class JokeEvent extends WorkflowEvent<{ joke: string }> {}
export class CritiqueEvent extends WorkflowEvent<{ critique: string }> {} export class CritiqueEvent extends WorkflowEvent<{ critique: string }> {}
export class AnalysisEvent extends WorkflowEvent<{ analysis: string }> {} export class AnalysisEvent extends WorkflowEvent<{ analysis: string }> {}
const generateJoke = async (_context: Context, ev: StartEvent) => { const generateJoke = async (_: unknown, ev: StartEvent<string>) => {
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 }); const response = await llm.complete({ prompt });
return new JokeEvent({ joke: response.text }); 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 prompt = `Give a thorough critique of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt }); const response = await llm.complete({ prompt });
return new CritiqueEvent({ critique: response.text }); 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 prompt = `Give a thorough analysis of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt }); const response = await llm.complete({ prompt });
return new AnalysisEvent({ analysis: response.text }); return new AnalysisEvent({ analysis: response.text });
}; };
const reportJoke = async ( const reportJoke = async (
context: Context, context: HandlerContext,
ev: AnalysisEvent | CritiqueEvent, ev1: AnalysisEvent,
ev2: CritiqueEvent,
) => { ) => {
const events = context.collectEvents(ev, [AnalysisEvent, CritiqueEvent]); const subPrompts = [ev1.data.analysis, ev2.data.critique];
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 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 }); const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text }); return new StopEvent(response.text);
}; };
const jokeFlow = new Workflow(); const jokeFlow = new Workflow<unknown, string, string>();
jokeFlow.addStep(StartEvent, generateJoke); jokeFlow.addStep(
jokeFlow.addStep(JokeEvent, critiqueJoke); {
jokeFlow.addStep(JokeEvent, analyzeJoke); inputs: [StartEvent<string>],
jokeFlow.addStep([AnalysisEvent, CritiqueEvent], reportJoke); 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 // Usage
async function main() { async function main() {
const result = await jokeFlow.run("pirates"); const result = await jokeFlow.run("pirates");
console.log(result.data.result); console.log(result.data);
} }
main().catch(console.error); main().catch(console.error);
+21 -10
View File
@@ -1,10 +1,9 @@
import { import {
Context,
StartEvent, StartEvent,
StopEvent, StopEvent,
Workflow, Workflow,
WorkflowEvent, WorkflowEvent,
} from "@llamaindex/core/workflow"; } from "@llamaindex/workflow";
import { OpenAI } from "llamaindex"; import { OpenAI } from "llamaindex";
// Create LLM instance // Create LLM instance
@@ -13,26 +12,38 @@ const llm = new OpenAI();
// Create a custom event type // Create a custom event type
export class JokeEvent extends WorkflowEvent<{ joke: string }> {} export class JokeEvent extends WorkflowEvent<{ joke: string }> {}
const generateJoke = async (_context: Context, ev: StartEvent) => { const generateJoke = async (_: unknown, ev: StartEvent<string>) => {
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 }); const response = await llm.complete({ prompt });
return new JokeEvent({ joke: response.text }); 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 prompt = `Give a thorough critique of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt }); const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text }); return new StopEvent(response.text);
}; };
const jokeFlow = new Workflow({ verbose: true }); const jokeFlow = new Workflow<unknown, string, string>();
jokeFlow.addStep(StartEvent, generateJoke); jokeFlow.addStep(
jokeFlow.addStep(JokeEvent, critiqueJoke); {
inputs: [StartEvent<string>],
outputs: [JokeEvent],
},
generateJoke,
);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [StopEvent<string>],
},
critiqueJoke,
);
// Usage // Usage
async function main() { async function main() {
const result = await jokeFlow.run("pirates"); const result = await jokeFlow.run("pirates");
console.log(result.data.result); console.log(result.data);
} }
main().catch(console.error); main().catch(console.error);
+32 -15
View File
@@ -1,10 +1,10 @@
import { import {
Context, HandlerContext,
StartEvent, StartEvent,
StopEvent, StopEvent,
Workflow, Workflow,
WorkflowEvent, WorkflowEvent,
} from "@llamaindex/core/workflow"; } from "@llamaindex/workflow";
import { OpenAI } from "llamaindex"; import { OpenAI } from "llamaindex";
// Create LLM instance // Create LLM instance
@@ -12,38 +12,55 @@ const llm = new OpenAI();
// Create custom event types // Create custom event types
export class JokeEvent extends WorkflowEvent<{ joke: string }> {} export class JokeEvent extends WorkflowEvent<{ joke: string }> {}
export class MessageEvent extends WorkflowEvent<{ msg: string }> {} export class MessageEvent extends WorkflowEvent<{ msg: string }> {}
const generateJoke = async (context: Context, ev: StartEvent) => { const generateJoke = async (context: HandlerContext, ev: StartEvent) => {
context.writeEventToStream( context.sendEvent(
new MessageEvent({ msg: `Generating a joke about: ${ev.data.input}` }), 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 }); const response = await llm.complete({ prompt });
return new JokeEvent({ joke: response.text }); return new JokeEvent({ joke: response.text });
}; };
const critiqueJoke = async (context: Context, ev: JokeEvent) => { const critiqueJoke = async (context: HandlerContext, ev: JokeEvent) => {
context.writeEventToStream( context.sendEvent(
new MessageEvent({ msg: `Write a critique of this joke: ${ev.data.joke}` }), 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 prompt = `Give a thorough critique of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt }); const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text }); return new StopEvent(response.text);
}; };
const jokeFlow = new Workflow(); const jokeFlow = new Workflow();
jokeFlow.addStep(StartEvent, generateJoke); jokeFlow.addStep(
jokeFlow.addStep(JokeEvent, critiqueJoke); {
inputs: [StartEvent<string>],
outputs: [JokeEvent],
},
generateJoke,
);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [StopEvent<string>],
},
critiqueJoke,
);
// Usage // Usage
async function main() { async function main() {
const run = jokeFlow.run("pirates"); const run = jokeFlow.run("pirates");
for await (const event of jokeFlow.streamEvents()) { for await (const event of run) {
console.log((event as MessageEvent).data.msg); 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); main().catch(console.error);
+25 -14
View File
@@ -1,19 +1,21 @@
import { import { StartEvent, StopEvent, Workflow } from "@llamaindex/workflow";
Context,
StartEvent,
StopEvent,
Workflow,
} from "@llamaindex/core/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 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() { async function timeout() {
const workflow = new Workflow({ verbose: true, timeout: 1 }); const workflow = new Workflow<unknown, string, string>({
workflow.addStep(StartEvent, longRunning); timeout: 1,
// This will timeout });
workflow.addStep(
{
inputs: [StartEvent<string>],
outputs: [StopEvent<string>],
},
longRunning,
);
try { try {
await workflow.run("Let's start"); await workflow.run("Let's start");
} catch (error) { } catch (error) {
@@ -23,14 +25,23 @@ async function timeout() {
async function notimeout() { async function notimeout() {
// Increase timeout to 3 seconds - no timeout // Increase timeout to 3 seconds - no timeout
const workflow = new Workflow({ verbose: true, timeout: 3 }); const workflow = new Workflow<unknown, string, string>({
workflow.addStep(StartEvent, longRunning); timeout: 3,
});
workflow.addStep(
{
inputs: [StartEvent<string>],
outputs: [StopEvent<string>],
},
longRunning,
);
const result = await workflow.run("Let's start"); const result = await workflow.run("Let's start");
console.log(result.data.result); console.log(result.data);
} }
async function main() { async function main() {
await timeout(); await timeout();
console.log("---");
await notimeout(); await notimeout();
} }
+40 -15
View File
@@ -1,10 +1,9 @@
import { import {
Context,
StartEvent, StartEvent,
StopEvent, StopEvent,
Workflow, Workflow,
WorkflowEvent, WorkflowEvent,
} from "@llamaindex/core/workflow"; } from "@llamaindex/workflow";
import { OpenAI } from "llamaindex"; import { OpenAI } from "llamaindex";
// Create LLM instance // Create LLM instance
@@ -13,40 +12,66 @@ const llm = new OpenAI();
// Create a custom event type // Create a custom event type
export class JokeEvent extends WorkflowEvent<{ joke: string }> {} export class JokeEvent extends WorkflowEvent<{ joke: string }> {}
const generateJoke = async (_context: Context, ev: StartEvent) => { const generateJoke = async (_: unknown, ev: StartEvent<string>) => {
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 }); const response = await llm.complete({ prompt });
return new JokeEvent({ joke: response.text }); 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 prompt = `Give a thorough critique of the following joke: ${ev.data.joke}`;
const response = await llm.complete({ prompt }); const response = await llm.complete({ prompt });
return new StopEvent({ result: response.text }); return new StopEvent(response.text);
}; };
async function validateFails() { async function validateFails() {
try { try {
const jokeFlow = new Workflow({ verbose: true, validate: true }); const jokeFlow = new Workflow();
jokeFlow.addStep(StartEvent, generateJoke, { outputs: StopEvent }); jokeFlow.addStep(
jokeFlow.addStep(JokeEvent, critiqueJoke, { outputs: StopEvent }); {
await jokeFlow.run("pirates"); 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) { } catch (e) {
console.error("Validation failed:", e); console.error("Validation failed:", e);
} }
} }
async function validate() { async function validate() {
const jokeFlow = new Workflow({ verbose: true, validate: true }); const jokeFlow = new Workflow();
jokeFlow.addStep(StartEvent, generateJoke, { outputs: JokeEvent }); jokeFlow.addStep(
jokeFlow.addStep(JokeEvent, critiqueJoke, { outputs: StopEvent }); {
const result = await jokeFlow.run("pirates"); inputs: [StartEvent<string>],
console.log(result.data.result); outputs: [JokeEvent],
},
generateJoke,
);
jokeFlow.addStep(
{
inputs: [JokeEvent],
outputs: [StopEvent<string>],
},
critiqueJoke,
);
const result = await jokeFlow.run("pirates").strict();
console.log(result.data);
} }
// Usage // Usage
async function main() { async function main() {
await validateFails(); await validateFails();
console.log("---");
await validate(); await validate();
} }
+13
View File
@@ -1,5 +1,18 @@
# @llamaindex/autotool # @llamaindex/autotool
## 5.0.11
### Patch Changes
- llamaindex@0.8.11
## 5.0.10
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 5.0.9 ## 5.0.9
### Patch Changes ### Patch Changes
@@ -1,5 +1,20 @@
# @llamaindex/autotool-01-node-example # @llamaindex/autotool-01-node-example
## 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 ## 0.0.52
### 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.52" "version": "0.0.54"
} }
@@ -1,5 +1,20 @@
# @llamaindex/autotool-02-next-example # @llamaindex/autotool-02-next-example
## 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 ## 0.1.96
### 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.96", "version": "0.1.98",
"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.9", "version": "5.0.11",
"description": "auto transpile your JS function to LLM Agent compatible", "description": "auto transpile your JS function to LLM Agent compatible",
"files": [ "files": [
"dist", "dist",
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/cloud # @llamaindex/cloud
## 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 ## 2.0.6
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/cloud", "name": "@llamaindex/cloud",
"version": "2.0.6", "version": "2.0.8",
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/community # @llamaindex/community
## 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 ## 0.0.64
### 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.64", "version": "0.0.66",
"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",
+13
View File
@@ -1,5 +1,18 @@
# @llamaindex/core # @llamaindex/core
## 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 ## 0.4.6
### 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.6", "version": "0.4.8",
"description": "LlamaIndex Core Module", "description": "LlamaIndex Core Module",
"exports": { "exports": {
"./agent": { "./agent": {
+3 -1
View File
@@ -65,7 +65,9 @@ export abstract class BaseChatStoreMemory<
super(); super();
} }
getAllMessages(): ChatMessage<AdditionalMessageOptions>[] { getAllMessages():
| ChatMessage<AdditionalMessageOptions>[]
| Promise<ChatMessage<AdditionalMessageOptions>[]> {
return this.chatStore.getMessages(this.chatStoreKey); return this.chatStore.getMessages(this.chatStoreKey);
} }
@@ -33,11 +33,11 @@ export class ChatMemoryBuffer<
} }
} }
getMessages( async getMessages(
transientMessages?: ChatMessage<AdditionalMessageOptions>[] | undefined, transientMessages?: ChatMessage<AdditionalMessageOptions>[] | undefined,
initialTokenCount: number = 0, initialTokenCount: number = 0,
) { ) {
const messages = this.getAllMessages(); const messages = await this.getAllMessages();
if (initialTokenCount > this.tokenLimit) { if (initialTokenCount > this.tokenLimit) {
throw new Error("Initial token count exceeds token limit"); throw new Error("Initial token count exceeds token limit");
@@ -7,7 +7,11 @@ export abstract class BaseChatStore<
key: string, key: string,
messages: ChatMessage<AdditionalMessageOptions>[], messages: ChatMessage<AdditionalMessageOptions>[],
): void; ): void;
abstract getMessages(key: string): ChatMessage<AdditionalMessageOptions>[]; abstract getMessages(
key: string,
):
| ChatMessage<AdditionalMessageOptions>[]
| Promise<ChatMessage<AdditionalMessageOptions>[]>;
abstract addMessage( abstract addMessage(
key: string, key: string,
message: ChatMessage<AdditionalMessageOptions>, message: ChatMessage<AdditionalMessageOptions>,
+21 -13
View File
@@ -4,18 +4,12 @@ import { zodToJsonSchema } from "zod-to-json-schema";
import type { JSONValue } from "../global"; import type { JSONValue } from "../global";
import type { BaseTool, ToolMetadata } from "../llms"; import type { BaseTool, ToolMetadata } from "../llms";
const kOriginalFn = Symbol("originalFn");
export class FunctionTool<T, R extends JSONValue | Promise<JSONValue>> export class FunctionTool<T, R extends JSONValue | Promise<JSONValue>>
implements BaseTool<T> implements BaseTool<T>
{ {
[kOriginalFn]?: (input: T) => R;
#fn: (input: T) => R; #fn: (input: T) => R;
#metadata: ToolMetadata<JSONSchemaType<T>>; readonly #metadata: ToolMetadata<JSONSchemaType<T>>;
// todo: for the future, we can use zod to validate the input parameters readonly #zodType: z.ZodType<T> | null = null;
// eslint-disable-next-line no-unused-private-class-members
#zodType: z.ZodType<T> | null = null;
constructor( constructor(
fn: (input: T) => R, fn: (input: T) => R,
metadata: ToolMetadata<JSONSchemaType<T>>, metadata: ToolMetadata<JSONSchemaType<T>>,
@@ -32,6 +26,12 @@ export class FunctionTool<T, R extends JSONValue | Promise<JSONValue>>
fn: (input: T) => JSONValue | Promise<JSONValue>, fn: (input: T) => JSONValue | Promise<JSONValue>,
schema: ToolMetadata<JSONSchemaType<T>>, schema: ToolMetadata<JSONSchemaType<T>>,
): FunctionTool<T, JSONValue | Promise<JSONValue>>; ): 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>>( static from<T, R extends z.ZodType<T>>(
fn: (input: T) => JSONValue | Promise<JSONValue>, fn: (input: T) => JSONValue | Promise<JSONValue>,
schema: Omit<ToolMetadata, "parameters"> & { schema: Omit<ToolMetadata, "parameters"> & {
@@ -40,15 +40,15 @@ export class FunctionTool<T, R extends JSONValue | Promise<JSONValue>>
): FunctionTool<T, JSONValue>; ): FunctionTool<T, JSONValue>;
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
static from(fn: any, schema: any): any { static from(fn: any, schema: any): any {
if (schema.parameter instanceof z.ZodSchema) { if (schema.parameters instanceof z.ZodSchema) {
const jsonSchema = zodToJsonSchema(schema.parameter); const jsonSchema = zodToJsonSchema(schema.parameters);
return new FunctionTool( return new FunctionTool(
fn, fn,
{ {
...schema, ...schema,
parameters: jsonSchema, parameters: jsonSchema,
}, },
schema.parameter, schema.parameters,
); );
} }
return new FunctionTool(fn, schema); 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"]; 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); return this.#fn.call(null, input);
} };
} }
+14
View File
@@ -13,6 +13,8 @@ export type StepFunction<T extends WorkflowEvent = WorkflowEvent> = (
type EventTypeParam = EventTypes | EventTypes[]; type EventTypeParam = EventTypes | EventTypes[];
let once = false;
export class Workflow { export class Workflow {
#steps: Map< #steps: Map<
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -29,8 +31,20 @@ export class Workflow {
verbose?: boolean; verbose?: boolean;
timeout?: number; timeout?: number;
validate?: boolean; 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.#verbose = params.verbose ?? false;
this.#timeout = params.timeout ?? null; this.#timeout = params.timeout ?? null;
this.#validate = params.validate ?? false; this.#validate = params.validate ?? false;
@@ -19,7 +19,7 @@ describe("ChatMemoryBuffer", () => {
expect(buffer.tokenLimit).toBe(500); 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[] = [ const messages: ChatMessage[] = [
{ role: "user", content: "Hello" }, { role: "user", content: "Hello" },
{ role: "assistant", content: "Hi there!" }, { role: "assistant", content: "Hi there!" },
@@ -30,11 +30,11 @@ describe("ChatMemoryBuffer", () => {
chatHistory: messages, chatHistory: messages,
}); });
const result = buffer.getMessages(); const result = await buffer.getMessages();
expect(result).toEqual(messages); expect(result).toEqual(messages);
}); });
test("getMessages truncates messages when over token limit", () => { test("getMessages truncates messages when over token limit", async () => {
const messages: ChatMessage[] = [ const messages: ChatMessage[] = [
{ role: "user", content: "This is a long message" }, { role: "user", content: "This is a long message" },
{ role: "assistant", content: "This is also a long reply" }, { role: "assistant", content: "This is also a long reply" },
@@ -45,11 +45,11 @@ describe("ChatMemoryBuffer", () => {
chatHistory: messages, chatHistory: messages,
}); });
const result = buffer.getMessages(); const result = await buffer.getMessages();
expect(result).toEqual([{ role: "user", content: "Short" }]); expect(result).toEqual([{ role: "user", content: "Short" }]);
}); });
test("getMessages handles input messages", () => { test("getMessages handles input messages", async () => {
const storedMessages: ChatMessage[] = [ const storedMessages: ChatMessage[] = [
{ role: "user", content: "Hello" }, { role: "user", content: "Hello" },
{ role: "assistant", content: "Hi there!" }, { role: "assistant", content: "Hi there!" },
@@ -62,13 +62,13 @@ describe("ChatMemoryBuffer", () => {
const inputMessages: ChatMessage[] = [ const inputMessages: ChatMessage[] = [
{ role: "user", content: "New message" }, { role: "user", content: "New message" },
]; ];
const result = buffer.getMessages(inputMessages); const result = await buffer.getMessages(inputMessages);
expect(result).toEqual([...inputMessages, ...storedMessages]); expect(result).toEqual([...inputMessages, ...storedMessages]);
}); });
test("getMessages throws error when initial token count exceeds limit", () => { test("getMessages throws error when initial token count exceeds limit", () => {
const buffer = new ChatMemoryBuffer({ tokenLimit: 10 }); 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", "Initial token count exceeds token limit",
); );
}); });
+13
View File
@@ -1,5 +1,18 @@
# @llamaindex/experimental # @llamaindex/experimental
## 0.0.123
### Patch Changes
- llamaindex@0.8.11
## 0.0.122
### Patch Changes
- Updated dependencies [f066e50]
- llamaindex@0.8.10
## 0.0.121 ## 0.0.121
### 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.121", "version": "0.0.123",
"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",
+43
View File
@@ -1,5 +1,48 @@
# llamaindex # llamaindex
## 0.8.11
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
- @llamaindex/cloud@2.0.8
- @llamaindex/node-parser@0.0.9
- @llamaindex/anthropic@0.0.17
- @llamaindex/clip@0.0.17
- @llamaindex/deepinfra@0.0.17
- @llamaindex/huggingface@0.0.17
- @llamaindex/ollama@0.0.24
- @llamaindex/openai@0.1.33
- @llamaindex/portkey-ai@0.0.17
- @llamaindex/replicate@0.0.17
- @llamaindex/readers@1.0.9
- @llamaindex/groq@0.0.32
- @llamaindex/vllm@0.0.3
## 0.8.10
### Patch Changes
- f066e50: feat: vllm support
- Updated dependencies [f066e50]
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/vllm@0.0.2
- @llamaindex/core@0.4.7
- @llamaindex/cloud@2.0.7
- @llamaindex/node-parser@0.0.8
- @llamaindex/anthropic@0.0.16
- @llamaindex/clip@0.0.16
- @llamaindex/deepinfra@0.0.16
- @llamaindex/huggingface@0.0.16
- @llamaindex/ollama@0.0.23
- @llamaindex/openai@0.1.32
- @llamaindex/portkey-ai@0.0.16
- @llamaindex/replicate@0.0.16
- @llamaindex/readers@1.0.8
- @llamaindex/groq@0.0.31
## 0.8.9 ## 0.8.9
### Patch Changes ### Patch Changes
+3 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "llamaindex", "name": "llamaindex",
"version": "0.8.9", "version": "0.8.11",
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"keywords": [ "keywords": [
@@ -44,6 +44,7 @@
"@llamaindex/portkey-ai": "workspace:*", "@llamaindex/portkey-ai": "workspace:*",
"@llamaindex/readers": "workspace:*", "@llamaindex/readers": "workspace:*",
"@llamaindex/replicate": "workspace:*", "@llamaindex/replicate": "workspace:*",
"@llamaindex/vllm": "workspace:*",
"@mistralai/mistralai": "^1.0.4", "@mistralai/mistralai": "^1.0.4",
"@mixedbread-ai/sdk": "^2.2.11", "@mixedbread-ai/sdk": "^2.2.11",
"@pinecone-database/pinecone": "^3.0.2", "@pinecone-database/pinecone": "^3.0.2",
@@ -85,10 +86,10 @@
} }
}, },
"devDependencies": { "devDependencies": {
"@huggingface/transformers": "^3.0.2",
"@swc/cli": "^0.5.0", "@swc/cli": "^0.5.0",
"@swc/core": "^1.7.22", "@swc/core": "^1.7.22",
"@vercel/postgres": "^0.10.0", "@vercel/postgres": "^0.10.0",
"@huggingface/transformers": "^3.0.2",
"concurrently": "^9.1.0", "concurrently": "^9.1.0",
"glob": "^11.0.0", "glob": "^11.0.0",
"pg": "^8.12.0", "pg": "^8.12.0",
+1 -1
View File
@@ -1,3 +1,4 @@
export { VLLM, type VLLMParams } from "@llamaindex/vllm";
export { export {
ALL_AVAILABLE_ANTHROPIC_LEGACY_MODELS, ALL_AVAILABLE_ANTHROPIC_LEGACY_MODELS,
ALL_AVAILABLE_ANTHROPIC_MODELS, ALL_AVAILABLE_ANTHROPIC_MODELS,
@@ -6,7 +7,6 @@ export {
} from "./anthropic.js"; } from "./anthropic.js";
export { FireworksLLM } from "./fireworks.js"; export { FireworksLLM } from "./fireworks.js";
export { Gemini, GeminiSession } from "./gemini/base.js"; export { Gemini, GeminiSession } from "./gemini/base.js";
export { export {
GEMINI_MODEL, GEMINI_MODEL,
type GoogleGeminiSessionOptions, type GoogleGeminiSessionOptions,
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/node-parser # @llamaindex/node-parser
## 0.0.9
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
## 0.0.8
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
## 0.0.7 ## 0.0.7
### Patch Changes ### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@llamaindex/node-parser", "name": "@llamaindex/node-parser",
"version": "0.0.7", "version": "0.0.9",
"description": "Node parser for LlamaIndex", "description": "Node parser for LlamaIndex",
"type": "module", "type": "module",
"exports": { "exports": {
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/anthropic # @llamaindex/anthropic
## 0.0.17
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
## 0.0.16
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
## 0.0.15 ## 0.0.15
### Patch Changes ### Patch Changes
+1 -1
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.15", "version": "0.0.17",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
+17
View File
@@ -1,5 +1,22 @@
# @llamaindex/clip # @llamaindex/clip
## 0.0.17
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
- @llamaindex/openai@0.1.33
## 0.0.16
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
- @llamaindex/openai@0.1.32
## 0.0.15 ## 0.0.15
### 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.15", "version": "0.0.17",
"type": "module", "type": "module",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"main": "dist/index.cjs", "main": "dist/index.cjs",
+17
View File
@@ -1,5 +1,22 @@
# @llamaindex/deepinfra # @llamaindex/deepinfra
## 0.0.17
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
- @llamaindex/openai@0.1.33
## 0.0.16
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
- @llamaindex/openai@0.1.32
## 0.0.15 ## 0.0.15
### 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.15", "version": "0.0.17",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
+12
View File
@@ -1,5 +1,17 @@
# @llamaindex/groq # @llamaindex/groq
## 0.0.32
### Patch Changes
- @llamaindex/openai@0.1.33
## 0.0.31
### Patch Changes
- @llamaindex/openai@0.1.32
## 0.0.30 ## 0.0.30
### 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.30", "version": "0.0.32",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -1,5 +1,22 @@
# @llamaindex/huggingface # @llamaindex/huggingface
## 0.0.17
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
- @llamaindex/openai@0.1.33
## 0.0.16
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
- @llamaindex/openai@0.1.32
## 0.0.15 ## 0.0.15
### 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.15", "version": "0.0.17",
"type": "module", "type": "module",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"main": "dist/index.cjs", "main": "dist/index.cjs",
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/ollama # @llamaindex/ollama
## 0.0.24
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
## 0.0.23
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
## 0.0.22 ## 0.0.22
### 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.22", "version": "0.0.24",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/openai # @llamaindex/openai
## 0.1.33
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
## 0.1.32
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
## 0.1.31 ## 0.1.31
### 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.31", "version": "0.1.33",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
@@ -1,5 +1,20 @@
# @llamaindex/portkey-ai # @llamaindex/portkey-ai
## 0.0.17
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
## 0.0.16
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
## 0.0.15 ## 0.0.15
### 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.15", "version": "0.0.17",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/replicate # @llamaindex/replicate
## 0.0.17
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
## 0.0.16
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
## 0.0.15 ## 0.0.15
### 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.15", "version": "0.0.17",
"type": "module", "type": "module",
"main": "./dist/index.cjs", "main": "./dist/index.cjs",
"module": "./dist/index.js", "module": "./dist/index.js",
+14
View File
@@ -0,0 +1,14 @@
# @llamaindex/vllm
## 0.0.3
### Patch Changes
- @llamaindex/openai@0.1.33
## 0.0.2
### Patch Changes
- f066e50: feat: vllm support
- @llamaindex/openai@0.1.32
+38
View File
@@ -0,0 +1,38 @@
{
"name": "@llamaindex/vllm",
"description": "vLLM Adapter for LlamaIndex",
"version": "0.0.3",
"type": "module",
"main": "./dist/index.cjs",
"module": "./dist/index.js",
"exports": {
".": {
"require": {
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
},
"import": {
"types": "./dist/index.d.ts",
"default": "./dist/index.js"
}
}
},
"files": [
"dist"
],
"repository": {
"type": "git",
"url": "https://github.com/run-llama/LlamaIndexTS.git",
"directory": "packages/providers/vllm"
},
"scripts": {
"build": "bunchee",
"dev": "bunchee --watch"
},
"devDependencies": {
"bunchee": "5.6.1"
},
"dependencies": {
"@llamaindex/openai": "workspace:*"
}
}
+1
View File
@@ -0,0 +1 @@
export { VLLM, type VLLMParams } from "./llm";
+25
View File
@@ -0,0 +1,25 @@
/**
* vLLM
*
* https://docs.vllm.ai/en/latest/index.html
*
* @module
*/
import { OpenAI } from "@llamaindex/openai";
export type VLLMParams = {
model: string;
baseURL?: string;
};
export class VLLM extends OpenAI {
constructor(params: VLLMParams) {
super({
additionalSessionOptions: {
baseURL: "http://localhost:8000/v1",
},
model: params.model,
apiKey: "token-abc123",
});
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"extends": "../../../tsconfig.json",
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "bundler",
"outDir": "./lib",
"tsBuildInfoFile": "./lib/.tsbuildinfo"
},
"include": ["./src", "package.json"],
"references": [
{
"path": "../openai/tsconfig.json"
}
]
}
+15
View File
@@ -1,5 +1,20 @@
# @llamaindex/readers # @llamaindex/readers
## 1.0.9
### Patch Changes
- Updated dependencies [f865c98]
- @llamaindex/core@0.4.8
## 1.0.8
### Patch Changes
- Updated dependencies [d89ebe0]
- Updated dependencies [fd8c882]
- @llamaindex/core@0.4.7
## 1.0.7 ## 1.0.7
### 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.7", "version": "1.0.9",
"type": "module", "type": "module",
"exports": { "exports": {
"./node/hook": "./node/dist/hook.js", "./node/hook": "./node/dist/hook.js",
+6
View File
@@ -1,5 +1,11 @@
# @llamaindex/workflow # @llamaindex/workflow
## 0.0.4
### Patch Changes
- fd8c882: fix: infinite loop issue caused by multiple inputs in edge cases
## 0.0.3 ## 0.0.3
### 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.3", "version": "0.0.4",
"type": "module", "type": "module",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"module": "dist/index.js", "module": "dist/index.js",
+20
View File
@@ -289,6 +289,15 @@ export class WorkflowContext<Start = string, Stop = string, Data = unknown>
(event) => event instanceof requestEvent, (event) => event instanceof requestEvent,
); );
if (acceptableInput) { if (acceptableInput) {
// remove the event from the queue, in case of infinite loop
const protocolIdx = this.#queue.findIndex(
(protocol) =>
protocol.type === "event" &&
protocol.event === acceptableInput,
);
if (protocolIdx !== -1) {
this.#queue.splice(protocolIdx, 1);
}
this.#pendingInputQueue.splice( this.#pendingInputQueue.splice(
this.#pendingInputQueue.indexOf(acceptableInput), this.#pendingInputQueue.indexOf(acceptableInput),
1, 1,
@@ -329,6 +338,17 @@ export class WorkflowContext<Start = string, Stop = string, Data = unknown>
inputs, inputs,
[event, ...acceptableInputs], [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 (events.length !== inputs.length) {
if (this.#verbose) { if (this.#verbose) {
console.log( console.log(
+4
View File
@@ -79,6 +79,10 @@ export class Workflow<ContextData, Start, Stop> {
return this; return this;
} }
hasStep(stepFn: StepHandler): boolean {
return this.#steps.has(stepFn);
}
removeStep(stepFn: StepHandler): this { removeStep(stepFn: StepHandler): this {
this.#steps.delete(stepFn); this.#steps.delete(stepFn);
return this; return this;
+20 -4
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.5 specifier: ^0.4.7
version: link:../packages/core version: link:../packages/core
'@llamaindex/readers': '@llamaindex/readers':
specifier: ^1.0.6 specifier: ^1.0.8
version: link:../packages/readers version: link:../packages/readers
'@llamaindex/workflow': '@llamaindex/workflow':
specifier: ^0.0.3 specifier: ^0.0.4
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.8 specifier: ^0.8.10
version: link:../packages/llamaindex version: link:../packages/llamaindex
mongodb: mongodb:
specifier: ^6.7.0 specifier: ^6.7.0
@@ -1026,6 +1026,9 @@ importers:
'@llamaindex/replicate': '@llamaindex/replicate':
specifier: workspace:* specifier: workspace:*
version: link:../providers/replicate version: link:../providers/replicate
'@llamaindex/vllm':
specifier: workspace:*
version: link:../providers/vllm
'@mistralai/mistralai': '@mistralai/mistralai':
specifier: ^1.0.4 specifier: ^1.0.4
version: 1.1.0(zod@3.23.8) version: 1.1.0(zod@3.23.8)
@@ -1350,6 +1353,16 @@ importers:
specifier: 5.6.1 specifier: 5.6.1
version: 5.6.1(typescript@5.6.3) version: 5.6.1(typescript@5.6.3)
packages/providers/vllm:
dependencies:
'@llamaindex/openai':
specifier: workspace:*
version: link:../openai
devDependencies:
bunchee:
specifier: 5.6.1
version: 5.6.1(typescript@5.6.3)
packages/readers: packages/readers:
dependencies: dependencies:
'@azure/cosmos': '@azure/cosmos':
@@ -1474,6 +1487,9 @@ importers:
tree-sitter-typescript: tree-sitter-typescript:
specifier: ^0.23.0 specifier: ^0.23.0
version: 0.23.0(tree-sitter@0.22.0) version: 0.23.0(tree-sitter@0.22.0)
zod:
specifier: ^3.23.8
version: 3.23.8
devDependencies: devDependencies:
'@azure/cosmos': '@azure/cosmos':
specifier: ^4.1.1 specifier: ^4.1.1
+3
View File
@@ -53,6 +53,9 @@
{ {
"path": "./packages/providers/ollama/tsconfig.json" "path": "./packages/providers/ollama/tsconfig.json"
}, },
{
"path": "./packages/providers/vllm/tsconfig.json"
},
{ {
"path": "./packages/cloud/tsconfig.json" "path": "./packages/cloud/tsconfig.json"
}, },
+28
View File
@@ -1,5 +1,33 @@
# @llamaindex/unit-test # @llamaindex/unit-test
## 0.0.20
### 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.19
### 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.18 ## 0.0.18
### Patch Changes ### Patch Changes
+3 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "@llamaindex/unit-test", "name": "@llamaindex/unit-test",
"private": true, "private": true,
"version": "0.0.18", "version": "0.0.20",
"type": "module", "type": "module",
"scripts": { "scripts": {
"test": "vitest run" "test": "vitest run"
@@ -26,6 +26,7 @@
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"tree-sitter": "^0.22.0", "tree-sitter": "^0.22.0",
"tree-sitter-javascript": "^0.23.0", "tree-sitter-javascript": "^0.23.0",
"tree-sitter-typescript": "^0.23.0" "tree-sitter-typescript": "^0.23.0",
"zod": "^3.23.8"
} }
} }
+34
View File
@@ -0,0 +1,34 @@
import { FunctionTool } from "@llamaindex/core/tools";
import { describe, expect, test } from "vitest";
import { z } from "zod";
describe("function-tool", () => {
test("zod type check", () => {
const inputSchema = z.object({
name: z.string(),
age: z.coerce.number(),
});
const tool = FunctionTool.from(
(input) => {
if (typeof input.age !== "number") {
throw new Error("Age should be a number");
}
return "Hello " + input.name + " " + input.age;
},
{
name: "get-user",
description: "Get user by name and age",
parameters: inputSchema,
},
);
{
const response = tool.call({ name: "John", age: 30 });
expect(response).toBe("Hello John 30");
}
{
// @ts-expect-error age should be a number
const response = tool.call({ name: "John", age: "30" });
expect(response).toBe("Hello John 30");
}
});
});