콘텐츠로 이동

트레이싱

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

대부분의 환경에서는 트레이스가 정기적으로 자동 내보내기 됩니다. 브라우저 또는 Cloudflare Workers에서는 이 기능이 기본적으로 비활성화됩니다. 큐에 너무 많은 트레이스가 쌓이면 여전히 내보내기되지만, 정기 간격으로는 내보내기되지 않습니다. 대신 코드 수명 주기에서 getGlobalTraceProvider().forceFlush()를 사용해 수동으로 트레이스를 내보내야 합니다.

예를 들어 Cloudflare Worker에서는 코드를 try/catch/finally 블록으로 감싸고 waitUntil과 함께 강제 플러시를 사용해, 워커가 종료되기 전에 트레이스가 내보내지도록 해야 합니다.

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) 는 “워크플로”의 단일 엔드 투 엔드 작업을 나타냅니다. 스팬으로 구성됩니다. 트레이스에는 다음 속성이 있습니다:
    • workflow_name: 논리적 워크플로 또는 앱 이름입니다. 예: “Code generation” 또는 “Customer service”
    • trace_id: 트레이스의 고유 ID입니다. 전달하지 않으면 자동 생성됩니다. 형식은 trace_<32_alphanumeric> 여야 합니다
    • group_id: 선택적 그룹 ID로, 동일한 대화에서 발생한 여러 트레이스를 연결합니다. 예: 채팅 스레드 ID 사용
    • disabled: True이면 트레이스가 기록되지 않습니다
    • metadata: 트레이스의 선택적 메타데이터
  • 스팬(Spans) 은 시작 및 종료 시간이 있는 작업을 나타냅니다. 스팬에는 다음이 있습니다:
    • started_atended_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와 함께 RealtimeAgentRealtimeSession을 사용하는 경우, 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}`);
});
  1. 두 번의 run 호출이 withTrace()로 감싸져 있으므로, 각각의 실행은 두 개의 트레이스를 만드는 대신 전체 트레이스의 일부가 됩니다.

withTrace() 함수를 사용해 트레이스를 생성할 수 있습니다. 또는 getGlobalTraceProvider().createTrace()로 새 트레이스를 수동 생성해 withTrace()에 전달할 수 있습니다.

현재 트레이스는 Node.js AsyncLocalStorage 또는 해당 환경의 폴리필을 통해 추적됩니다. 이는 동시성 환경에서도 자동으로 동작함을 의미합니다.

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

스팬은 자동으로 현재 트레이스의 일부가 되며, Node.js AsyncLocalStorage 또는 해당 환경의 폴리필로 추적되는 가장 가까운 현재 스팬 아래에 중첩됩니다.

일부 스팬은 잠재적으로 민감한 데이터를 캡처할 수 있습니다.

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

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

커스텀 수집 동작이 필요하면 OpenAITracingExporter 를 직접 인스턴스화하고 setTraceProcessors(...) 또는 addTraceProcessor(...)로 설치하세요. 익스포터는 apiKey, endpoint, organization, project, maxRetries, baseDelay, maxDelay를 지원합니다.

기본 프로세서를 교체한 뒤, 기본 OpenAI 익스포터와 배치 프로세서를 복원하려면 setDefaultOpenAITracingExporter()를 호출하세요.

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

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

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

  • 초기화 시 전역 TraceProvider를 생성합니다. 이는 트레이스를 생성할 책임이 있으며 getGlobalTraceProvider()를 통해 접근할 수 있습니다.
  • TraceProviderBatchTraceProcessor로 구성하고, 이는 트레이스/스팬을 배치로 OpenAITracingExporter에 전송합니다. 익스포터는 스팬과 트레이스를 배치로 OpenAI 백엔드로 내보냅니다.

이 기본 설정을 사용자 지정하여 대체 또는 추가 백엔드로 트레이스를 전송하거나 익스포터 동작을 수정하려면 다음 두 가지 옵션이 있습니다:

  1. addTraceProcessor()는 트레이스와 스팬이 준비될 때 이를 수신하는 추가 트레이스 프로세서를 추가할 수 있게 합니다. 이를 통해 OpenAI 백엔드로의 전송 외에 자체 처리를 수행할 수 있습니다.
  2. setTraceProcessors()는 기본 프로세서를 사용자 정의 트레이스 프로세서로 교체할 수 있게 합니다. 이 경우 OpenAI 백엔드로 트레이스가 전송되지 않으며, 그렇게 하려면 해당 기능을 수행하는 TracingProcessor를 포함해야 합니다.