Compare commits

...

11 Commits

Author SHA1 Message Date
Clelia (Astra) Bertelli df71df48c0 ci: linting, type checking and testing - fix 2025-08-08 16:30:40 +02:00
Clelia (Astra) Bertelli d4b6fe6156 Merge branch 'main' into clelia/llm-exec-response-format 2025-08-08 15:41:30 +02:00
Clelia (Astra) Bertelli 6a426305da chore: add example for structured response 2025-07-22 13:39:51 +02:00
Clelia (Astra) Bertelli 56924edded chore: move all tool examples to zod/v4 2025-07-22 13:37:18 +02:00
Clelia (Astra) Bertelli b0985d1b8c chore: move tools to zod/v4 for better schema conversion 2025-07-22 13:18:17 +02:00
Logan Markewich 72d681be47 remove tests 2025-07-18 10:09:45 -06:00
Logan Markewich da751b28fe fix typing 2025-07-18 09:32:25 -06:00
Logan Markewich 3109f6640f fix typing 2025-07-18 09:21:07 -06:00
Clelia (Astra) Bertelli 1214b5f3ef fix: better schema for the tool 2025-07-18 16:08:54 +02:00
Clelia (Astra) Bertelli 53a8cb9b4a chore: changesets 2025-07-18 12:34:05 +02:00
Clelia (Astra) Bertelli d647786e67 feat: add responseFormat to llm.exec 2025-07-18 12:32:12 +02:00
43 changed files with 157 additions and 106 deletions
+9
View File
@@ -0,0 +1,9 @@
---
"@llamaindex/workflow": minor
"@llamaindex/tools": minor
"@llamaindex/core": minor
"@llamaindex/resolution-tests": patch
"@llamaindex/e2e": patch
---
Moving tools from zod to zod/v4; adding responseFormat to llm.exec
@@ -1 +1 @@
{"root":["./src/main.ts","./vite.config.ts"],"version":"5.7.3"}
{"root":["./src/main.ts","./vite.config.ts"],"version":"5.8.3"}
+6 -16
View File
@@ -1,5 +1,5 @@
import { FunctionTool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
function sumNumbers({ a, b }: { a: number; b: number }) {
return `${a + b}`;
@@ -13,12 +13,8 @@ export const sumNumbersTool = FunctionTool.from(sumNumbers, {
name: "sumNumbers",
description: "Use this function to sum two numbers",
parameters: z.object({
a: z.number({
description: "The first number",
}),
b: z.number({
description: "The second number",
}),
a: z.number({}).describe("The first number"),
b: z.number({}).describe("The second number"),
}),
});
@@ -26,12 +22,8 @@ export const divideNumbersTool = FunctionTool.from(divideNumbers, {
name: "divideNumbers",
description: "Use this function to divide two numbers",
parameters: z.object({
a: z.number({
description: "The first number",
}),
b: z.number({
description: "The second number",
}),
a: z.number({}).describe("The first number"),
b: z.number({}).describe("The second number"),
}),
});
@@ -44,9 +36,7 @@ export const getWeatherTool = FunctionTool.from(
name: "getWeather",
description: "Get the weather for a city",
parameters: z.object({
city: z.string({
description: "The city to get the weather for",
}),
city: z.string({}).describe("The city to get the weather for"),
}),
},
);
+1 -1
View File
@@ -3,7 +3,7 @@ import { agent } from "@llamaindex/workflow";
import { Settings, tool } from "llamaindex";
import { ok } from "node:assert";
import { test } from "node:test";
import { z } from "zod";
import * as z from "zod/v4";
Settings.llm = new OpenAI({ model: "gpt-4-0613" });
+2 -4
View File
@@ -8,7 +8,7 @@ import {
import fs from "fs";
import { tool } from "llamaindex";
import os from "os";
import { z } from "zod";
import * as z from "zod/v4";
import { wiki } from "@llamaindex/tools";
const llm = openai({
@@ -20,9 +20,7 @@ const saveFileTool = tool({
description:
"Save the written content into a file that can be downloaded by the user",
parameters: z.object({
content: z.string({
description: "The content to save into a file",
}),
content: z.string().describe("The content to save into a file"),
}),
execute: ({ content }: { content: string }) => {
const filePath = os.tmpdir() + "/report.md";
+2 -4
View File
@@ -1,7 +1,7 @@
import { OpenAI } from "@llamaindex/openai";
import { agent } from "@llamaindex/workflow";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
const csvData =
"TITLE,RELEASE_YEAR,SCORE,NUMBER_OF_VOTES,DURATION,MAIN_GENRE,MAIN_PRODUCTION\nDavid Attenborough: A Life on Our Planet,2020,9,31180,83,documentary,GB\nInception,2010,8.8,2268288,148,scifi,GB\nForrest Gump,1994,8.8,1994599,142,drama,US\nAnbe Sivam,2003,8.7,20595,160,comedy,IN\nBo Burnham: Inside,2021,8.7,44074,87,comedy,US\nSaving Private Ryan,1998,8.6,1346020,169,drama,US\nDjango Unchained,2012,8.4,1472668,165,western,US\nDangal,2016,8.4,180247,161,action,IN\nBo Burnham: Make Happy,2016,8.4,14356,60,comedy,US\nLouis C.K.: Hilarious,2010,8.4,11973,84,comedy,US\nDave Chappelle: Sticks & Stones,2019,8.4,25687,65,comedy,US\n3 Idiots,2009,8.4,385782,170,comedy,IN\nBlack Friday,2004,8.4,20611,143,crime,IN\nSuper Deluxe,2019,8.4,13680,176,thriller,IN\nWinter on Fire: Ukraine's Fight for Freedom,2015,8.3,17710,98,documentary,UA\nOnce Upon a Time in America,1984,8.3,342335,229,drama,US\nTaxi Driver,1976,8.3,795222,113,crime,US\nLike Stars on Earth,2007,8.3,188234,165,drama,IN\nBo Burnham: What.,2013,8.3,11488,60,comedy,US\nFull Metal Jacket,1987,8.3,723306,116,drama,GB\nWarrior,2011,8.2,463276,140,drama,US\nDrishyam,2015,8.2,79075,163,thriller,IN\nQueen,2014,8.2,64805,146,drama,IN\nPaan Singh Tomar,2012,8.2,35888,135,drama,IN";
@@ -17,9 +17,7 @@ const userQuestion = "which are the best comedies after 2010?";
description:
"Execute python code in a Jupyter notebook cell and return any result, stdout, stderr, display_data, and error.",
parameters: z.object({
code: z.string({
description: "The python code to execute in a single cell.",
}),
code: z.string().describe("The python code to execute in a single cell."),
}),
execute: ({ code }) => {
console.log(
+3 -7
View File
@@ -15,7 +15,7 @@ import {
stopAgentEvent,
} from "@llamaindex/workflow";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
const llm = openai({
model: "gpt-4o-mini",
@@ -26,9 +26,7 @@ const temperatureConverterTool = tool({
description: "Convert a temperature from Fahrenheit to Celsius",
name: "fahrenheitToCelsius",
parameters: z.object({
temperature: z.number({
description: "The temperature in Fahrenheit",
}),
temperature: z.number().describe("The temperature in Fahrenheit"),
}),
execute: ({ temperature }) => {
return ((temperature - 32) * 5) / 9;
@@ -39,9 +37,7 @@ const temperatureFetcherTool = tool({
description: "Fetch the temperature (in Fahrenheit) for a city",
name: "fetchTemperature",
parameters: z.object({
city: z.string({
description: "The city to fetch the temperature for",
}),
city: z.string().describe("The city to fetch the temperature for"),
}),
execute: ({ city }) => {
const temperature = Math.floor(Math.random() * 58) + 32;
+1 -1
View File
@@ -1,7 +1,7 @@
import { openai } from "@llamaindex/openai";
import { agent } from "@llamaindex/workflow";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
const sumNumbers = tool({
name: "sumNumbers",
+4 -10
View File
@@ -6,7 +6,7 @@ import {
} from "@llamaindex/workflow";
import fs from "fs";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
import { anthropic } from "@llamaindex/anthropic";
@@ -14,9 +14,7 @@ const weatherTool = tool({
name: "weather",
description: "Get the weather",
parameters: z.object({
location: z.string({
description: "The location to get the weather for",
}),
location: z.string().describe("The location to get the weather for"),
}),
execute: ({ location }) => {
return `The weather in ${location} is sunny`;
@@ -27,9 +25,7 @@ const inflationTool = tool({
name: "inflation",
description: "Get the inflation",
parameters: z.object({
location: z.string({
description: "The location to get the inflation for",
}),
location: z.string().describe("The location to get the inflation for"),
}),
execute: ({ location }) => {
return `The inflation in ${location} is 2%`;
@@ -41,9 +37,7 @@ const saveFileTool = tool({
description:
"Save the written content into a file that can be downloaded by the user",
parameters: z.object({
content: z.string({
description: "The content to save into a file",
}),
content: z.string().describe("The content to save into a file"),
}),
execute: ({ content }) => {
const filePath = "./report.md";
+1 -1
View File
@@ -1,6 +1,6 @@
import { openai } from "@llamaindex/openai";
import { tool } from "llamaindex";
import z from "zod";
import * as z from "zod/v4";
import { ChatMessage } from "llamaindex";
+1 -1
View File
@@ -1,6 +1,6 @@
import { openai } from "@llamaindex/openai";
import { ChatMessage, tool } from "llamaindex";
import z from "zod";
import * as z from "zod/v4";
async function main() {
const llm = openai({ model: "gpt-4.1-mini" });
@@ -0,0 +1,38 @@
import { Anthropic } from "@llamaindex/anthropic";
import { ChatMessage, ToolCall } from "llamaindex";
import * as z from "zod/v4";
const llm = new Anthropic({ model: "claude-4-0-sonnet" });
const responseSchema = z.object({
title: z.string(),
author: z.string(),
year: z.number(),
});
async function main() {
const messages: ChatMessage[] = [];
let toolCalls: ToolCall[] = [];
do {
const result = await llm.exec({
messages: [
{
role: "system",
content: `You are a book expert. Your task is, given a user message, extract the title, author and publication year of the book and output them in JSON format.`,
},
{
role: "user",
content: `I have been reading La Divina Commedia by Dante Alighieri, published in 1321, which tells the story of a guy who goes through Hell, Purgatory and Heaven just to meet his beloved ex-girlfriend.`,
},
],
responseFormat: responseSchema,
});
messages.push(...result.newMessages);
toolCalls = result.toolCalls;
} while (toolCalls.length == 0);
console.log(messages[1].content);
console.log(toolCalls);
}
main().catch(console.error);
+1 -1
View File
@@ -1,5 +1,5 @@
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
export const getCurrentIDTool = tool({
name: "get_user_id",
@@ -1,6 +1,6 @@
import { OpenAI } from "@llamaindex/openai";
import { FunctionTool, ToolCallOptions } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
(async () => {
// The tool call will generate a partial JSON for `gpt-4-turbo`
@@ -29,9 +29,9 @@ async function callLLM(init: { model: string }) {
description:
"Execute python code in a Jupyter notebook cell and return any result, stdout, stderr, display_data, and error.",
parameters: z.object({
code: z.string({
description: "The python code to execute in a single cell.",
}),
code: z
.string()
.describe("The python code to execute in a single cell."),
}),
},
);
@@ -6,7 +6,7 @@ import {
NodeWithScore,
VectorStoreIndex,
} from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
async function main() {
// Load the documents
@@ -1,6 +1,6 @@
import { OpenAIAgent } from "@llamaindex/openai";
import { FunctionTool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
// Define a function to sum two numbers
function sumNumbers({ a, b }: { a: number; b: number }) {
+1 -1
View File
@@ -2,7 +2,7 @@ import { anthropic } from "@llamaindex/anthropic";
import { wiki } from "@llamaindex/tools";
import { agent } from "@llamaindex/workflow";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
const workflow = agent({
tools: [
+1 -2
View File
@@ -1,8 +1,7 @@
import { gemini, GEMINI_MODEL } from "@llamaindex/google";
import { agent } from "@llamaindex/workflow";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
const sumNumbers = tool({
name: "sumNumbers",
description: "Use this function to sum two numbers",
+1 -2
View File
@@ -1,8 +1,7 @@
import { gemini, GEMINI_MODEL } from "@llamaindex/google";
import fs from "fs";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
(async () => {
if (!process.env.GOOGLE_API_KEY) {
throw new Error("Please set the GOOGLE_API_KEY environment variable.");
+2 -4
View File
@@ -2,15 +2,13 @@ import { gemini, GEMINI_MODEL } from "@llamaindex/google";
import { ModalityType, tool } from "llamaindex";
import { liveEvents } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
const weatherTool = tool({
name: "weather",
description: "Get the weather",
parameters: z.object({
location: z.string({
description: "The location to get the weather for",
}),
location: z.string().describe("The location to get the weather for"),
}),
execute: ({ location }) => {
return `The weather in ${location} is rainy`;
+1 -1
View File
@@ -3,7 +3,7 @@ import { wiki } from "@llamaindex/tools";
import { agent } from "@llamaindex/workflow";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
const workflow = agent({
tools: [
+1 -1
View File
@@ -2,7 +2,7 @@ import { openaiResponses } from "@llamaindex/openai";
import { wiki } from "@llamaindex/tools";
import { agent } from "@llamaindex/workflow";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
const workflow = agent({
tools: [
@@ -1,15 +1,13 @@
import { openaiResponses } from "@llamaindex/openai";
import { tool } from "llamaindex";
import { z } from "zod";
import * as z from "zod/v4";
async function main() {
const weatherTool = tool({
name: "weather",
description: "Get the weather",
parameters: z.object({
location: z.string({
description: "The location to get the weather for",
}),
location: z.string().describe("The location to get the weather for"),
}),
execute: ({ location }) => {
return `The weather in ${location} is sunny`;
+28
View File
@@ -1,4 +1,6 @@
import { emptyLogger } from "@llamaindex/env";
import type { JSONObject } from "../global";
import { tool } from "../tools/";
import { extractText } from "../utils/llms";
import { streamConverter } from "../utils/stream";
import { callToolToMessage, getToolCallsFromResponse } from "./tool-call";
@@ -18,6 +20,7 @@ import type {
PartialToolCall,
ToolCallLLMMessageOptions,
} from "./type";
import { isZodSchema } from "./utils";
export abstract class BaseLLM<
AdditionalChatOptions extends object = object,
@@ -97,6 +100,31 @@ export abstract class BaseLLM<
| ExecResponse<AdditionalMessageOptions>
| ExecStreamResponse<AdditionalMessageOptions>
> {
const responseFormat = params.responseFormat;
if (responseFormat && isZodSchema(responseFormat)) {
const structuredTool = tool({
name: "format_output",
description: "Respond with a JSON object",
parameters: responseFormat,
execute: (args) => {
const result = responseFormat.safeParse(args);
if (!result.success) {
console.error("Invalid input from LLM:", result.error);
return JSON.stringify({
error: "Invalid schema",
details: result.error,
});
}
return result.data as JSONObject;
},
});
if (Array.isArray(params.tools)) {
params.tools.push(structuredTool);
} else {
params.tools = [structuredTool];
}
params.responseFormat = undefined;
}
if (params.stream) {
return this.streamExec(params);
}
+13
View File
@@ -1,3 +1,4 @@
import * as z from "zod/v4";
import type {
ChatMessage,
MessageContentImageDataDetail,
@@ -26,3 +27,15 @@ export function addContentPart<AdditionalMessageOptions extends object>(
}
}
}
export function isZodSchema(obj: unknown): obj is z.ZodType {
return (
obj !== null &&
typeof obj === "object" &&
"parse" in obj &&
typeof (obj as { parse: unknown }).parse === "function" &&
"safeParse" in obj &&
typeof (obj as { safeParse: unknown }).safeParse === "function" &&
"_def" in obj
);
}
+5 -6
View File
@@ -1,7 +1,6 @@
import { consoleLogger, type Logger } from "@llamaindex/env";
import type { JSONSchemaType } from "ajv";
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";
import * as z from "zod/v4";
import type { JSONValue } from "../global";
import type { BaseTool, ToolMetadata } from "../llms";
@@ -94,8 +93,8 @@ export class FunctionTool<
) {
const { execute, parameters, ...restConfig } = fnOrConfig;
if (parameters instanceof z.ZodSchema) {
const jsonSchema = zodToJsonSchema(parameters);
if (parameters instanceof z.ZodType) {
const jsonSchema = z.toJSONSchema(parameters);
return new FunctionTool(
execute,
{
@@ -110,8 +109,8 @@ export class FunctionTool<
}
// Handle the original cases
if (schema && schema.parameters instanceof z.ZodSchema) {
const jsonSchema = zodToJsonSchema(schema.parameters);
if (schema && schema.parameters instanceof z.ZodType) {
const jsonSchema = z.toJSONSchema(schema.parameters);
return new FunctionTool(
fnOrConfig,
{
+2 -4
View File
@@ -1,6 +1,6 @@
import { FunctionTool, tool } from "@llamaindex/core/tools";
import { describe, expect, test, vi } from "vitest";
import { z } from "zod";
import * as z from "zod/v4";
describe("FunctionTool", () => {
test("type system", () => {
@@ -37,9 +37,7 @@ describe("FunctionTool", () => {
name: "saveFile",
description: "Save the content into a file",
parameters: z.object({
content: z.string({
description: "The content to save into a file",
}),
content: z.string({}).describe("The content to save into a file"),
}),
execute: mockExecute,
};
@@ -1,7 +1,7 @@
import { Settings, type JSONValue } from "@llamaindex/core/global";
import type { ChatMessage, LLM } from "@llamaindex/core/llms";
import { tool } from "@llamaindex/core/tools";
import { z } from "zod";
import * as z from "zod/v4";
const CODE_ARTIFACT_GENERATION_PROMPT = `You are a highly skilled software engineer. Your task is to generate a code artifact based on the user's request.
Follow these instructions exactly:
+1 -1
View File
@@ -1,7 +1,7 @@
import { Settings, type JSONValue } from "@llamaindex/core/global";
import type { ChatMessage } from "@llamaindex/core/llms";
import { tool } from "@llamaindex/core/tools";
import { z } from "zod";
import * as z from "zod/v4";
// prompt based on https://github.com/e2b-dev/ai-artifacts
const CODE_GENERATION_PROMPT = `You are a skilled software engineer. You do not make mistakes. Generate an artifact. You can install additional dependencies. You can use one of the following templates:\n
@@ -1,7 +1,7 @@
import { Settings, type JSONValue } from "@llamaindex/core/global";
import type { ChatMessage, LLM } from "@llamaindex/core/llms";
import { tool } from "@llamaindex/core/tools";
import { z } from "zod";
import * as z from "zod/v4";
const DOCUMENT_ARTIFACT_GENERATION_PROMPT = `You are a highly skilled content creator. Your task is to generate a document artifact based on the user's request.
Follow these instructions exactly:
@@ -1,7 +1,7 @@
import { tool } from "@llamaindex/core/tools";
import { marked } from "marked";
import path from "node:path";
import { z } from "zod";
import * as z from "zod/v4";
import { getFileUrl, saveDocument } from "../helper";
const COMMON_STYLES = `
+1 -1
View File
@@ -1,6 +1,6 @@
import { tool } from "@llamaindex/core/tools";
import { search } from "duck-duck-scrape";
import { z } from "zod";
import * as z from "zod/v4";
export type DuckDuckGoToolOutput = Array<{
title: string;
+1 -1
View File
@@ -3,7 +3,7 @@ import { tool } from "@llamaindex/core/tools";
import fs from "fs";
import Papa from "papaparse";
import path from "path";
import { z } from "zod";
import * as z from "zod/v4";
import { getFileUrl, saveDocument } from "../helper";
export type MissingCell = {
+1 -1
View File
@@ -4,7 +4,7 @@ import { FormData } from "formdata-node";
import got from "got";
import path from "path";
import { Readable } from "stream";
import { z } from "zod";
import * as z from "zod/v4";
import { getFileUrl, saveDocument } from "../helper";
export type ImgGeneratorToolOutput = {
+1 -1
View File
@@ -3,7 +3,7 @@ import { tool } from "@llamaindex/core/tools";
import { randomUUID } from "@llamaindex/env";
import fs from "fs";
import path from "node:path";
import { z } from "zod";
import * as z from "zod/v4";
import { getFileUrl, saveDocument } from "../helper";
export type InterpreterExtraType =
+1 -1
View File
@@ -1,5 +1,5 @@
import { tool } from "@llamaindex/core/tools";
import { z } from "zod";
import * as z from "zod/v4";
export type WeatherToolOutput = {
latitude: number;
+1 -1
View File
@@ -1,6 +1,6 @@
import { tool } from "@llamaindex/core/tools";
import { default as wikipedia } from "wikipedia";
import { z } from "zod";
import * as z from "zod/v4";
export type WikiToolOutput = {
title: string;
@@ -17,7 +17,7 @@ import {
type WorkflowEventData,
} from "@llamaindex/workflow-core";
import { createStatefulMiddleware } from "@llamaindex/workflow-core/middleware/state";
import { z } from "zod";
import * as z from "zod/v4";
import type { AgentWorkflowState, BaseWorkflowAgent } from "./base";
import {
agentInputEvent,
@@ -680,12 +680,8 @@ export class AgentWorkflow implements Workflow {
agent_info: JSON.stringify(agentInfo),
}),
parameters: z.object({
toAgent: z.string({
description: "The name of the agent to hand off to",
}),
reason: z.string({
description: "The reason for handing off to the agent",
}),
toAgent: z.string({}).describe("The name of the agent to hand off to"),
reason: z.string({}).describe("The content to save into a file"),
}),
execute: (
{
@@ -11,8 +11,7 @@ import {
type WorkflowContext,
type WorkflowEvent,
} from "@llamaindex/workflow-core";
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";
import * as z from "zod/v4";
import { AgentWorkflow } from "./agent-workflow";
import { type AgentWorkflowState, type BaseWorkflowAgent } from "./base";
import {
@@ -416,7 +415,7 @@ const createEventEmitterTool = (
event.schema.description ??
"Use this tool to send the event to the workflow.") +
`\n\nPlease provide the event data in the following JSON schema: ${JSON.stringify(
zodToJsonSchema(z.object({ eventData: event.schema })),
z.toJSONSchema(z.object({ eventData: event.schema })),
)}`;
return tool({
name: name,
@@ -3,7 +3,7 @@ import { MockLLM } from "@llamaindex/core/llms/mock";
import { FunctionTool } from "@llamaindex/core/tools";
import { Logger } from "@llamaindex/env";
import { describe, expect, test, vi } from "vitest";
import { z } from "zod";
import * as z from "zod/v4";
import {
AgentWorkflow,
FunctionAgent,
@@ -4,7 +4,8 @@ import { tool } from "@llamaindex/core/tools";
import { type WorkflowContext } from "@llamaindex/workflow-core";
import { zodEvent } from "@llamaindex/workflow-core/util/zod";
import { describe, expect, test, vi } from "vitest";
import { z } from "zod";
import { z as zod } from "zod";
import * as z from "zod/v4";
import { AgentToolCallResult, FunctionAgent } from "../src/agent";
const mockLLM = new MockLLM();
@@ -81,8 +82,8 @@ describe("FunctionAgent", () => {
// Create a result event
const resultEvent = zodEvent(
z.object({
value: z.string(),
zod.object({
value: zod.string(),
}),
{
debugLabel: "my_result_event",
@@ -91,8 +92,8 @@ describe("FunctionAgent", () => {
// Create an additional event
const additionalEvent = zodEvent(
z.object({
value: z.number(),
zod.object({
value: zod.number(),
}),
{
debugLabel: "additional_event",
+1 -1
View File
@@ -2,7 +2,7 @@ import { agent } from "@llamaindex/workflow";
import { Document, Settings, tool } from "llamaindex";
import { ok } from "node:assert";
import { test } from "node:test";
import { z } from "zod";
import * as z from "zod/v4";
import { openai } from "@llamaindex/openai";
import { VectorStoreIndex } from "llamaindex";
+1 -1
View File
@@ -1,6 +1,6 @@
import { FunctionTool } from "@llamaindex/core/tools";
import { describe, expect, test } from "vitest";
import { z } from "zod";
import * as z from "zod/v4";
describe("function-tool", () => {
test("zod type check", () => {