Define the tool
import { tool } from "ai";
import { z } from "zod";
const searchFarms = tool({
description: "Search for local farms near a location with optional product filters",
parameters: z.object({
lat: z.number().describe("Latitude"),
lng: z.number().describe("Longitude"),
radius: z.number().optional().describe("Search radius in miles (default 25)"),
products: z.string().optional().describe("Comma-separated product names"),
}),
execute: async ({ lat, lng, radius, products }) => {
const params = new URLSearchParams({
lat: String(lat),
lng: String(lng),
...(radius && { radius: String(radius) }),
...(products && { products }),
});
const res = await fetch(
`https://api.bhumifarms.co/v1/search?${params}`,
{ headers: { "X-API-Key": process.env.BHUMI_API_KEY! } }
);
const { data } = await res.json();
return data.slice(0, 5).map((farm: any) => ({
name: farm.name,
city: farm.city,
state: farm.state,
distance_mi: farm.distance_mi,
products: farm.products?.slice(0, 5),
}));
},
});
Use in a route handler
import { openai } from "@ai-sdk/openai";
import { streamText } from "ai";
export async function POST(req: Request) {
const { messages } = await req.json();
const result = streamText({
model: openai("gpt-4o"),
messages,
tools: { searchFarms },
});
return result.toDataStreamResponse();
}
User experience
User: "Find farms with eggs and raw milk near Portland"