Files
gh-jezweb-claude-skills-ski…/templates/shared/tracing-setup.ts
2025-11-30 08:25:09 +08:00

128 lines
3.9 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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();