Latest Articles
import { webSearchTool, Agent, AgentInputItem, Runner, withTrace } from "@openai/agents";
import { z } from "zod";
// Tool definitions
const webSearchPreview = webSearchTool({
userLocation: {
type: "approximate",
country: undefined,
region: undefined,
city: undefined,
timezone: undefined
},
searchContextSize: "medium"
})
const ClasiffierSchema = z.object({ classification: z.enum(["flight_info", "itinerary"]) });
const FlightAgentSchema = z.object({ number: z.string(), date: z.string(), progress: z.string(), airline: z.object({ name: z.string(), logo: z.string() }), departure: z.object({ city: z.string(), status: z.string(), time: z.string() }), arrival: z.object({ city: z.string(), status: z.string(), time: z.string() }) });
const clasiffier = new Agent({
name: "Clasiffier",
instructions: "You are a helpful travel assistant, classifying whether a message is about an itinerary or a flight ",
model: "gpt-4.1",
outputType: ClasiffierSchema,
modelSettings: {
temperature: 1,
topP: 1,
maxTokens: 2048,
store: true
}
});
const flightAgent = new Agent({
name: "Flight Agent",
instructions: "You are a travel assistant. Always recommend a specific flight to go to. Use airport codes. ",
model: "gpt-4.1",
tools: [
webSearchPreview
],
outputType: FlightAgentSchema,
modelSettings: {
temperature: 1,
topP: 1,
maxTokens: 2048,
store: true
}
});
const itineraryAgent = new Agent({
name: "Itinerary Agent",
instructions: "You are a travel assistant, so build a concise travel itinerary. ",
model: "gpt-4.1",
modelSettings: {
temperature: 1,
topP: 1,
maxTokens: 2048,
store: true
}
});
type WorkflowInput = { input_as_text: string };
// Main code entrypoint
export const runWorkflow = async (workflow: WorkflowInput) => {
return await withTrace("Travel Agent", async () => {
const state = {
};
const conversationHistory: AgentInputItem[] = [
{ role: "user", content: [{ type: "input_text", text: workflow.input_as_text }] }
];
const runner = new Runner({
traceMetadata: {
__trace_source__: "agent-builder",
workflow_id: "wf_696036709d148190995424dd302a9a5902533a808b870d9d"
}
});
const clasiffierResultTemp = await runner.run(
clasiffier,
[
...conversationHistory
]
);
conversationHistory.push(...clasiffierResultTemp.newItems.map((item) => item.rawItem));
if (!clasiffierResultTemp.finalOutput) {
throw new Error("Agent result is undefined");
}
const clasiffierResult = {
output_text: JSON.stringify(clasiffierResultTemp.finalOutput),
output_parsed: clasiffierResultTemp.finalOutput
};
if (clasiffierResult.output_parsed.classification == "flight_info") {
const flightAgentResultTemp = await runner.run(
flightAgent,
[
...conversationHistory
]
);
conversationHistory.push(...flightAgentResultTemp.newItems.map((item) => item.rawItem));
if (!flightAgentResultTemp.finalOutput) {
throw new Error("Agent result is undefined");
}
const flightAgentResult = {
output_text: JSON.stringify(flightAgentResultTemp.finalOutput),
output_parsed: flightAgentResultTemp.finalOutput
};
} else {
const itineraryAgentResultTemp = await runner.run(
itineraryAgent,
[
...conversationHistory
]
);
conversationHistory.push(...itineraryAgentResultTemp.newItems.map((item) => item.rawItem));
if (!itineraryAgentResultTemp.finalOutput) {
throw new Error("Agent result is undefined");
}
const itineraryAgentResult = {
output_text: itineraryAgentResultTemp.finalOutput ?? ""
};
}
});
}