/** * Tracing and debugging configuration for OpenAI Agents SDK * * Built-in tracing helps visualize agent execution: * - Agent transitions (handoffs) * - Tool calls * - LLM requests * - Guardrail executions * - Token usage * * Tracing is automatically enabled when you import from '@openai/agents' */ import { Agent, run } from '@openai/agents'; /** * Enable detailed logging for debugging */ export function enableVerboseLogging() { // Set environment variable for debug mode process.env.DEBUG = '@openai/agents:*'; } /** * Run agent with detailed trace logging */ export async function runWithTracing(agent: Agent, input: string) { console.log('šŸ” Starting traced agent execution...\n'); const result = await run(agent, input); // Log execution summary console.log('\nšŸ“Š Execution Summary:'); console.log('─────────────────────────────────────'); console.log('Final Output:', result.finalOutput); console.log('Current Agent:', result.currentAgent?.name || 'N/A'); console.log('Total Tokens:', result.usage.totalTokens); console.log('Input Tokens:', result.usage.inputTokens); console.log('Output Tokens:', result.usage.outputTokens); console.log('Conversation Turns:', result.history.length); console.log('─────────────────────────────────────\n'); // Log conversation history console.log('šŸ’¬ Conversation History:'); result.history.forEach((message, index) => { console.log(`\n[${index + 1}] ${message.role}:`); if (message.role === 'user' || message.role === 'assistant') { console.log(message.content); } else if (message.role === 'tool') { console.log(` Tool: ${message.name}`); console.log(` Result:`, message.result); } }); return result; } /** * Stream agent execution with event logging */ export async function runWithStreamTracing(agent: Agent, input: string) { console.log('šŸ” Starting streamed agent execution...\n'); const stream = await run(agent, input, { stream: true }); for await (const event of stream) { if (event.type === 'raw_model_stream_event') { // Raw model response chunk const chunk = event.data?.choices?.[0]?.delta?.content || ''; if (chunk) { process.stdout.write(chunk); } } else if (event.type === 'agent_updated_stream_event') { // Agent handoff occurred console.log(`\nšŸ”„ Handoff to: ${event.agent.name}`); } else if (event.type === 'run_item_stream_event') { // Tool call, output, or other run item if (event.name === 'tool_call') { console.log(`\nšŸ› ļø Tool call: ${event.item.name}`); console.log(` Arguments:`, event.item.arguments); } else if (event.name === 'tool_result') { console.log(`āœ… Tool result:`, event.item.result); } } } // Wait for completion await stream.completed; const result = stream.result; console.log('\n\nšŸ“Š Stream Summary:'); console.log('─────────────────────────────────────'); console.log('Total Tokens:', result.usage.totalTokens); console.log('─────────────────────────────────────\n'); return result; } /** * Example: Debug a complex multi-agent workflow */ export async function exampleTracedWorkflow() { // Enable verbose logging enableVerboseLogging(); const agent = new Agent({ name: 'Debug Agent', instructions: 'You are a debugging assistant.', }); // Run with tracing await runWithTracing( agent, 'Explain how to debug a TypeScript application' ); // Run with stream tracing await runWithStreamTracing( agent, 'What are the best debugging tools for Node.js?' ); } // Uncomment to run example // exampleTracedWorkflow();