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 ?? "" }; } }); }