Tools
What about extending the language model's capabilities beyond just generating text?
import { openai } from "@ai-sdk/openai";
import { generateText, tool } from "ai";
import "dotenv/config";
import { z } from "zod";
const main = async () => {
const result = await generateText({
model: openai("gpt-4o"),
prompt: "What's 10 + 5?",
tools: {
addNumbers: tool({
description: "Add two numbers together",
parameters: z.object({
num1: z.number(),
num2: z.number(),
}),
execute: async ({ num1, num2 }) => {
return num1 + num2;
},
}),
},
});
console.log(result.toolResults);
};
main();
With tools, you can allow the model to execute any arbitrary code, such as fetching data from an API or interacting with a database.
But we've had to log out the tool results and the model hasn't actually answered the question. How can we get the model to answer our question?
import { openai } from "@ai-sdk/openai";
import { generateText, tool } from "ai";
import "dotenv/config";
import { z } from "zod";
const main = async () => {
const result = await generateText({
model: openai("gpt-4o"),
prompt: "What's 10 + 5?",
maxSteps: 2,
tools: {
addNumbers: tool({
description: "Add two numbers together",
parameters: z.object({
num1: z.number(),
num2: z.number(),
}),
execute: async ({ num1, num2 }) => {
return num1 + num2;
},
}),
},
});
console.log(result.steps.length);
console.log(result.text);
};
main();
But what about multiple tools over multiple steps?
import { openai } from "@ai-sdk/openai";
import { generateText, tool } from "ai";
import "dotenv/config";
import { z } from "zod";
const main = async () => {
const result = await generateText({
model: openai("gpt-4o"),
prompt: "Get the weather in SF and NY, then add them together.",
maxSteps: 3,
tools: {
addNumbers: tool({
description: "Add two numbers together",
parameters: z.object({
num1: z.number(),
num2: z.number(),
}),
execute: async ({ num1, num2 }) => {
return num1 + num2;
},
}),
getWeather: tool({
description: "Get the current weather at a location",
parameters: z.object({
latitude: z.number(),
longitude: z.number(),
city: z.string(),
}),
execute: async ({ latitude, longitude, city }) => {
const response = await fetch(
`https://api.open-meteo.com/v1/forecast?latitude=${latitude}&longitude=${longitude}¤t=temperature_2m,weathercode,relativehumidity_2m&timezone=auto`,
);
const weatherData = await response.json();
return {
temperature: weatherData.current.temperature_2m,
weatherCode: weatherData.current.weathercode,
humidity: weatherData.current.relativehumidity_2m,
city,
};
},
}),
},
});
console.log(result.steps.length)
console.log(result.text);
};
main();