콘텐츠로 이동

트레이싱

Agents SDK에는 기본 제공 트레이싱이 포함되어 있어 에이전트 실행 중 발생하는 이벤트의 포괄적인 기록을 수집합니다. LLM 생성, 도구 호출, 핸드오프, 가드레일, 그리고 발생한 사용자 정의 이벤트까지 포함됩니다.
Traces 대시보드를 사용하면 개발 중과 프로덕션에서 워크플로를 디버그, 시각화, 모니터링할 수 있습니다.

지원되는 서버 런타임에서는 trace가 일정 주기로 내보내집니다.
Cloudflare Workers를 포함한 일부 런타임에서는 트레이싱 자체는 활성화되어 있어도 자동 내보내기 루프를 사용할 수 없습니다. 이러한 환경에서는 런타임이 종료되기 전에 대기 중인 trace를 내보내기 위해 요청 수명 주기의 일부로 getGlobalTraceProvider().forceFlush()를 호출해야 합니다.

브라우저에서는 기본적으로 트레이싱이 비활성화되어 있으므로 이 지침은 적용되지 않습니다.

예를 들어 Cloudflare Worker에서는 코드를 try/catch/finally 블록으로 감싸고 waitUntil과 함께 forceFlush()를 사용해 worker가 종료되기 전에 trace가 내보내지도록 해야 합니다.

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());
}
},
};
  • Traces는 하나의 “워크플로”에 대한 단일 end-to-end 작업을 나타냅니다. Trace는 Span으로 구성됩니다. Trace에는 다음 속성이 있습니다
    • workflow_name: 논리적 워크플로 또는 앱입니다. 예: “Code generation”, “Customer service”
    • trace_id: trace의 고유 ID입니다. 전달하지 않으면 자동 생성됩니다. 형식은 trace_<32_alphanumeric>이어야 합니다
    • group_id: 선택적 그룹 ID로, 같은 대화에서 여러 trace를 연결할 때 사용합니다. 예를 들어 채팅 스레드 ID를 사용할 수 있습니다
    • disabled: True이면 trace는 기록되지 않습니다
    • metadata: trace용 선택적 메타데이터입니다
  • Spans는 시작 시각과 종료 시각이 있는 작업을 나타냅니다. Span에는 다음이 있습니다
    • started_atended_at 타임스탬프
    • 소속 trace를 나타내는 trace_id
    • 이 Span의 상위 Span을 가리키는 parent_id(있는 경우)
    • Span에 대한 정보인 span_data. 예를 들어 AgentSpanData에는 Agent 정보, GenerationSpanData에는 LLM 생성 정보가 포함됩니다

기본적으로 SDK는 다음을 트레이싱합니다.

  • 전체 run() 또는 Runner.run()Trace로 감싸집니다
  • 에이전트가 실행될 때마다 AgentSpan으로 감싸집니다
  • LLM 생성은 GenerationSpan으로 감싸집니다
  • 함수 도구 호출 각각은 FunctionSpan으로 감싸집니다
  • 가드레일은 GuardrailSpan으로 감싸집니다
  • 핸드오프는 HandoffSpan으로 감싸집니다

기본적으로 trace 이름은 “Agent workflow”입니다. withTrace를 사용할 때 이 이름을 설정할 수 있으며, RunConfig.workflowName으로 이름과 다른 속성도 설정할 수 있습니다.

또한 사용자 정의 트레이싱 프로세서를 설정해 trace를 다른 대상(대체 또는 보조 대상)으로 전송할 수 있습니다.

RealtimeAgentRealtimeSession을 기본 OpenAI Realtime API와 함께 사용하는 경우, tracingDisabled: trueRealtimeSession에 설정하거나 OPENAI_AGENTS_DISABLE_TRACING 환경 변수를 사용해 비활성화하지 않는 한 Realtime API 측에서 자동으로 트레이싱이 수행됩니다.

자세한 내용은 음성 에이전트 개요를 확인하세요.

경우에 따라 여러 번의 run() 호출을 하나의 trace에 포함하고 싶을 수 있습니다. 이 경우 전체 코드를 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}`);
});
  1. 두 번의 run 호출이 withTrace()로 감싸져 있으므로, 각각의 실행은 개별 trace 두 개를 만드는 대신 전체 trace의 일부가 됩니다

withTrace() 함수를 사용해 trace를 생성할 수 있습니다. 또는 getGlobalTraceProvider().createTrace()를 사용해 새 trace를 수동으로 만들고 withTrace()에 전달할 수 있습니다.

현재 trace는 Node.js AsyncLocalStorage 또는 각 환경의 polyfill을 통해 추적됩니다. 즉, 동시성 환경에서도 자동으로 동작합니다.

다양한 create*Span()(예: createGenerationSpan(), createFunctionSpan() 등) 메서드를 사용해 span을 생성할 수 있습니다. 일반적으로 span을 수동으로 생성할 필요는 없습니다. 사용자 정의 span 정보를 추적하기 위한 createCustomSpan() 함수도 제공됩니다.

Span은 자동으로 현재 trace에 포함되며, 가장 가까운 현재 span 아래에 중첩됩니다. 이는 Node.js AsyncLocalStorage 또는 각 환경의 polyfill을 통해 추적됩니다.

일부 span은 잠재적으로 민감한 데이터를 수집할 수 있습니다.

createGenerationSpan()은 LLM 생성의 입력/출력을 저장하고,
createFunctionSpan()은 함수 호출의 입력/출력을 저장합니다. 이 데이터에는 민감한 정보가 포함될 수 있으므로,
RunConfig.traceIncludeSensitiveData를 통해 해당 데이터 수집을 비활성화할 수 있습니다.

지원되는 서버 런타임에서는 기본 트레이싱 설정이 이미 OpenAI로 내보내기를 수행합니다. trace 내보내기에 OPENAI_API_KEY와 다른 자격 증명을 사용해야 한다면 setTracingExportApiKey()를 사용하세요.

사용자 정의 수집 동작이 필요하다면 OpenAITracingExporter를 직접 인스턴스화하고 setTraceProcessors(...) 또는 addTraceProcessor(...)로 설치하세요. 이 exporter는 apiKey, endpoint, organization, project, maxRetries, baseDelay, maxDelay를 지원합니다.

기본 프로세서를 교체한 뒤 나중에 배치 프로세서와 함께 기본 OpenAI exporter를 복원하려면, setDefaultOpenAITracingExporter()를 호출하세요.

사용자 정의 트레이싱 프로세서

섹션 제목: “사용자 정의 트레이싱 프로세서”

트레이싱의 상위 수준 아키텍처는 다음과 같습니다.

이 기본 설정을 사용자 정의해 trace를 대체 또는 추가 백엔드로 전송하거나 exporter 동작을 변경하려면 두 가지 옵션이 있습니다.

  1. addTraceProcessor()를 사용하면 준비된 trace와 span을 받는 추가 트레이싱 프로세서를 추가할 수 있습니다. 이를 통해 OpenAI 백엔드로 전송하는 것에 더해 자체 처리를 수행할 수 있습니다
  2. setTraceProcessors()를 사용하면 기본 프로세서를 자체 트레이싱 프로세서로 교체할 수 있습니다. 이 경우 trace를 OpenAI 백엔드로 전송하는 TracingProcessor를 포함하지 않으면 trace는 전송되지 않습니다