트레이싱
Agents SDK에는 내장 트레이싱이 포함되어 있어 에이전트 실행 중 발생하는 이벤트의 포괄적인 기록을 수집합니다: LLM 생성, 도구 호출, 핸드오프, 가드레일, 발생한 커스텀 이벤트까지 포함됩니다. 트레이스 대시보드를 사용하면 개발 중과 프로덕션에서 워크플로를 디버그하고, 시각화하고, 모니터링할 수 있습니다.
내보내기 루프 수명 주기
섹션 제목: “내보내기 루프 수명 주기”지원되는 서버 런타임에서는 트레이스가 정기적인 간격으로 내보내집니다. Cloudflare Workers를 포함한 일부 런타임에서는 트레이싱 자체는 여전히 활성화되어 있더라도 자동 내보내기 루프를 사용할 수 없습니다. 이러한 환경에서는 런타임이 종료되기 전에 대기 중인 트레이스를 내보내도록 요청 수명 주기의 일부로 getGlobalTraceProvider().forceFlush()를 호출해야 합니다.
브라우저에서는 기본적으로 트레이싱이 비활성화되어 있으므로 이 지침은 적용되지 않습니다.
예를 들어 Cloudflare Worker에서는 코드를 try/catch/finally 블록으로 감싸고, 워커가 종료되기 전에 트레이스가 내보내지도록 waitUntil과 함께 forceFlush()를 사용해야 합니다.
import { getGlobalTraceProvider } from '@openai/agents';
export default { async fetch(request, env, ctx): Promise<Response> { try { // your agent code here return new Response(`success`); } catch (error) { console.error(error); return new Response(String(error), { status: 500 }); } finally { // make sure to flush any remaining traces before exiting ctx.waitUntil(getGlobalTraceProvider().forceFlush()); } },};트레이스와 스팬
섹션 제목: “트레이스와 스팬”- 트레이스는 “워크플로”의 단일 엔드투엔드 작업을 나타냅니다. 트레이스는 스팬으로 구성됩니다. 트레이스에는 다음 속성이 있습니다:
workflow_name: 논리적 워크플로 또는 앱입니다. 예를 들어 “코드 생성” 또는 “고객 서비스”입니다.trace_id: 트레이스의 고유 ID입니다. 전달하지 않으면 자동으로 생성됩니다. 형식은 반드시trace_<32_alphanumeric>이어야 합니다.group_id: 선택적 그룹 ID이며, 같은 대화의 여러 트레이스를 연결하는 데 사용합니다. 예를 들어 채팅 스레드 ID를 사용할 수 있습니다.disabled: True이면 트레이스가 기록되지 않습니다.metadata: 트레이스에 대한 선택적 메타데이터입니다.
- 스팬은 시작 시각과 종료 시각이 있는 작업을 나타냅니다. 스팬에는 다음이 있습니다:
started_at및ended_at타임스탬프trace_id: 스팬이 속한 트레이스를 나타냅니다parent_id: 이 스팬의 부모 스팬(있는 경우)을 가리킵니다span_data: 스팬에 대한 정보입니다. 예를 들어AgentSpanData에는 에이전트에 대한 정보가 포함되고,GenerationSpanData에는 LLM 생성에 대한 정보가 포함됩니다.
기본 트레이싱
섹션 제목: “기본 트레이싱”기본적으로 SDK는 다음을 트레이싱합니다:
- 전체
run()또는Runner.run()이Trace로 래핑됩니다. - 에이전트가 실행될 때마다
AgentSpan으로 래핑됩니다 - LLM 생성은
GenerationSpan으로 래핑됩니다 - 함수 도구 호출은 각각
FunctionSpan으로 래핑됩니다 - 가드레일은
GuardrailSpan으로 래핑됩니다 - 핸드오프는
HandoffSpan으로 래핑됩니다
기본적으로 트레이스의 이름은 “Agent workflow”입니다. withTrace를 사용하는 경우 이 이름을 설정할 수 있으며, RunConfig.workflowName으로 이름과 기타 속성을 구성할 수도 있습니다.
또한 트레이스를 다른 대상으로 보내도록 커스텀 트레이싱 프로세서를 설정할 수 있습니다(대체 대상 또는 보조 대상).
음성 에이전트 트레이싱
섹션 제목: “음성 에이전트 트레이싱”기본 OpenAI Realtime API와 함께 RealtimeAgent 및 RealtimeSession을 사용하는 경우, RealtimeSession에서 tracingDisabled: true를 사용하거나 OPENAI_AGENTS_DISABLE_TRACING 환경 변수를 사용해 비활성화하지 않는 한 트레이싱은 Realtime API 측에서 자동으로 수행됩니다.
자세한 내용은 음성 에이전트 개요를 참조하세요.
상위 수준 트레이스
섹션 제목: “상위 수준 트레이스”때로는 run()을 여러 번 호출한 결과가 단일 트레이스의 일부가 되도록 하고 싶을 수 있습니다. 전체 코드를 withTrace()로 감싸면 됩니다.
import { Agent, run, withTrace } from '@openai/agents';
const agent = new Agent({ name: 'Joke generator', instructions: 'Tell funny jokes.',});
await withTrace('Joke workflow', async () => { const result = await run(agent, 'Tell me a joke'); const secondResult = await run( agent, `Rate this joke: ${result.finalOutput}`, ); console.log(`Joke: ${result.finalOutput}`); console.log(`Rating: ${secondResult.finalOutput}`);});- 두 번의
run호출이withTrace()로 감싸져 있으므로, 개별 실행은 두 개의 트레이스를 생성하는 대신 전체 트레이스의 일부가 됩니다.
트레이스 생성
섹션 제목: “트레이스 생성”withTrace() 함수를 사용해 트레이스를 생성할 수 있습니다. 또는 getGlobalTraceProvider().createTrace()를 사용해 새 트레이스를 수동으로 생성한 뒤 withTrace()에 전달할 수도 있습니다.
현재 트레이스는 Node.js AsyncLocalStorage 또는 각 환경의 폴리필을 통해 추적됩니다. 즉, 동시성 환경에서도 자동으로 동작합니다.
스팬 생성
섹션 제목: “스팬 생성”다양한 create*Span()(예: createGenerationSpan(), createFunctionSpan() 등) 메서드를 사용해 스팬을 생성할 수 있습니다. 일반적으로 스팬을 수동으로 생성할 필요는 없습니다. 커스텀 스팬 정보를 추적하기 위한 createCustomSpan() 함수를 사용할 수 있습니다.
스팬은 자동으로 현재 트레이스의 일부가 되며, 가장 가까운 현재 스팬 아래에 중첩됩니다. 현재 스팬은 Node.js AsyncLocalStorage 또는 각 환경의 폴리필을 통해 추적됩니다.
민감한 데이터
섹션 제목: “민감한 데이터”일부 스팬은 잠재적으로 민감한 데이터를 캡처할 수 있습니다.
createGenerationSpan()은 LLM 생성의 입력/출력을 저장하고, createFunctionSpan()은 함수 호출의 입력/출력을 저장합니다. 여기에는 민감한 데이터가 포함될 수 있으므로 RunConfig.traceIncludeSensitiveData를 통해 해당 데이터 캡처를 비활성화할 수 있습니다.
OpenAI 트레이싱 익스포터
섹션 제목: “OpenAI 트레이싱 익스포터”지원되는 서버 런타임에서는 기본 트레이싱 설정이 이미 OpenAI로 내보내도록 구성되어 있습니다. 트레이스 내보내기에 OPENAI_API_KEY와 다른 자격 증명을 사용해야 하는 경우 setTracingExportApiKey()를 사용하세요.
커스텀 수집 동작이 필요한 경우 OpenAITracingExporter를 직접 인스턴스화하고 setTraceProcessors(...) 또는 addTraceProcessor(...)로 설치하세요. 이 익스포터는 apiKey, endpoint, organization, project, maxRetries, baseDelay, maxDelay를 지원합니다.
기본 프로세서를 교체한 뒤 나중에 배치 프로세서와 함께 기본 OpenAI 익스포터를 복원하려면 setDefaultOpenAITracingExporter()를 호출하세요.
커스텀 트레이싱 프로세서
섹션 제목: “커스텀 트레이싱 프로세서”트레이싱의 상위 수준 아키텍처는 다음과 같습니다:
- 초기화 시 전역
TraceProvider를 생성합니다. 이 provider는 트레이스 생성을 담당하며getGlobalTraceProvider()를 통해 접근할 수 있습니다. TraceProvider를BatchTraceProcessor로 구성합니다. 이 프로세서는 트레이스/스팬을 배치 단위로OpenAITracingExporter에 보내며, 이 익스포터는 스팬과 트레이스를 배치 단위로 OpenAI 백엔드에 내보냅니다.
이 기본 설정을 커스터마이즈하여 트레이스를 대체 또는 추가 백엔드로 보내거나 익스포터 동작을 수정하려면 두 가지 옵션이 있습니다:
addTraceProcessor()를 사용하면 준비된 트레이스와 스팬을 수신할 추가 트레이스 프로세서를 추가할 수 있습니다. 이를 통해 트레이스를 OpenAI 백엔드로 보내는 것에 더해 자체 처리를 수행할 수 있습니다.setTraceProcessors()를 사용하면 기본 프로세서를 자체 트레이스 프로세서로 교체할 수 있습니다. 즉, OpenAI 백엔드로 전송하는TracingProcessor를 포함하지 않는 한 트레이스는 OpenAI 백엔드로 전송되지 않습니다.