콘텐츠로 이동

실행 결과

에이전트 실행 시 다음 중 하나를 받게 됩니다.

두 결과 타입 모두 finalOutput, newItems, interruptions, state 같은 동일한 핵심 결과 인터페이스를 노출합니다. StreamedRunResultcompleted, toStream(), toTextStream(), currentAgent 같은 스트리밍 제어를 추가합니다.

대부분의 애플리케이션에는 몇 가지 속성만 필요합니다.

필요한 항목…사용
사용자에게 보여줄 최종 답변finalOutput
전체 로컬 대화 기록을 포함한 재실행 준비가 된 다음 턴 입력history
이 실행에서 새로 생성된 모델 형식 항목만output
에이전트/도구/핸드오프 메타데이터가 포함된 풍부한 실행 항목newItems
일반적으로 다음 사용자 턴을 처리해야 하는 에이전트lastAgent 또는 activeAgent
previousResponseId를 사용한 OpenAI Responses API 체이닝lastResponseId
대기 중인 승인 및 재개 가능한 스냅샷interruptionsstate
앱 컨텍스트, 승인, 사용량, 중첩 에이전트 도구 입력runContext
현재 중첩 Agent.asTool() 호출에 대한 메타데이터(예: customOutputExtractor 내부)agentToolInvocation
원문 모델 호출 또는 가드레일 진단rawResponses 및 가드레일 결과 배열

finalOutput 속성에는 마지막으로 실행된 에이전트의 최종 출력이 포함됩니다. 이 결과는 다음 중 하나입니다.

  • stringoutputType이 정의되지 않은 모든 에이전트의 기본값
  • unknown — 에이전트에 출력 타입으로 정의된 JSON 스키마가 있는 경우. 이 경우 JSON은 파싱되지만 타입은 여전히 직접 확인해야 합니다.
  • z.infer<outputType> — 에이전트에 출력 타입으로 정의된 Zod 스키마가 있는 경우. 출력은 이 스키마에 맞춰 자동으로 파싱됩니다.
  • undefined — 에이전트가 출력을 생성하지 않은 경우(예: 출력을 생성하기 전에 중지된 경우)

스트리밍 실행이 아직 진행 중이거나 최종 출력에 도달하기 전에 승인 인터럽션(중단 처리)에서 실행이 일시 중지된 경우에도 finalOutputundefined입니다.

서로 다른 출력 타입의 핸드오프를 사용 중이라면, 에이전트를 만들 때 new Agent() 생성자 대신 Agent.create() 메서드를 사용해야 합니다.

이를 통해 SDK는 가능한 모든 핸드오프에 걸쳐 출력 타입을 추론하고 finalOutput 속성에 유니언 타입을 제공할 수 있습니다.

예시:

핸드오프 최종 출력 타입
import { Agent, run } from '@openai/agents';
import { z } from 'zod';
const refundAgent = new Agent({
name: 'Refund Agent',
instructions:
'You are a refund agent. You are responsible for refunding customers.',
outputType: z.object({
refundApproved: z.boolean(),
}),
});
const orderAgent = new Agent({
name: 'Order Agent',
instructions:
'You are an order agent. You are responsible for processing orders.',
outputType: z.object({
orderId: z.string(),
}),
});
const triageAgent = Agent.create({
name: 'Triage Agent',
instructions:
'You are a triage agent. You are responsible for triaging customer issues.',
handoffs: [refundAgent, orderAgent],
});
const result = await run(triageAgent, 'I need to a refund for my order');
const output = result.finalOutput;
// ^? { refundApproved: boolean } | { orderId: string } | string | undefined

다음 속성들은 서로 다른 질문에 답합니다.

속성포함 내용적합한 용도
input이 실행의 기본 입력입니다. 핸드오프 입력 필터가 기록을 다시 작성했다면, 이 값은 실행이 이어간 필터링된 입력을 반영합니다.이 실행이 실제로 사용한 입력 감사
output이 실행에서 생성된 모델 형식 항목만 포함하며, 에이전트 메타데이터는 없습니다.새 모델 델타만 저장하거나 재실행
newItems에이전트/도구/핸드오프 메타데이터가 포함된 풍부한 RunItem 래퍼로그, UI, 감사, 디버깅
historyinput + newItems로 구성된 재실행 준비가 된 다음 턴 입력수동 채팅 루프 및 클라이언트 관리 대화 상태

실제로는 다음과 같습니다.

  • 애플리케이션에서 전체 대화를 직접 전달하며 관리할 때는 history를 사용하세요.
  • 이전 기록을 이미 다른 곳에 저장하고 있고 이 실행에서 새로 생성된 항목만 필요할 때는 output을 사용하세요.
  • 에이전트 연결, 도구 출력, 핸드오프 경계 또는 승인 항목이 필요할 때는 newItems를 사용하세요.
  • conversationId 또는 previousResponseId를 사용하는 경우, 일반적으로 history를 다시 run()에 전달하지 않습니다. 대신 새 사용자 입력만 전달하고 서버 관리 ID를 재사용합니다. 전체 비교는 에이전트 실행을 참고하세요.

history는 채팅과 유사한 사용 사례에서 전체 기록을 유지하는 편리한 방법입니다.

기록 루프
import { Agent, user, run } from '@openai/agents';
import type { AgentInputItem } from '@openai/agents';
const agent = new Agent({
name: 'Assistant',
instructions:
'You are a helpful assistant knowledgeable about recent AGI research.',
});
let history: AgentInputItem[] = [
// initial message
user('Are we there yet?'),
];
for (let i = 0; i < 10; i++) {
// run 10 times
const result = await run(agent, history);
// update the history to the new output
history = result.history;
history.push(user('How about now?'));
}

newItems는 실행 중 발생한 일을 가장 상세하게 보여줍니다. 일반적인 항목 타입은 다음과 같습니다.

어떤 에이전트가 항목을 생성했는지, 또는 해당 항목이 도구, 도구 검색, 핸드오프, 승인 경계를 나타내는지 알아야 할 때는 output보다 newItems를 선택하세요. toolSearchTool()을 사용할 때 이러한 도구 검색 항목은 일반 도구 호출이 발생하기 전에 어떤 지연된 도구나 네임스페이스가 로드되었는지 살펴보는 가장 쉬운 방법입니다.

로컬 도구 또는 MCP 서버가 customDataExtractor를 정의하는 경우, 해당 RunToolCallOutputItem.customData에는 반환된 SDK 전용 메타데이터가 포함됩니다. 이 데이터는 렌더러 힌트나 내부 ID 같은 애플리케이션 UI 상태에 유용합니다. RunState 직렬화 후에도 유지되지만, history에서는 제외되며 모델로 다시 전송되지 않습니다.

lastAgent 속성에는 마지막으로 실행된 에이전트가 포함됩니다. 이는 핸드오프 후 다음 사용자 턴에 재사용하기에 가장 적합한 에이전트인 경우가 많습니다. activeAgent는 같은 값에 대한 별칭입니다.

스트리밍 모드에서는 실행이 아직 진행 중일 때 currentAgent가 현재 활성 상태인 에이전트를 알려줍니다.

인터럽션(중단 처리) 및 재개 가능한 상태

섹션 제목: “인터럽션(중단 처리) 및 재개 가능한 상태”

도구에 승인이 필요한 경우 실행이 일시 중지되고, interruptions에는 대기 중인 RunToolApprovalItem 항목이 포함됩니다. 여기에는 직접 도구, 핸드오프 후 도달한 도구, 또는 중첩 agent.asTool() 실행에서 발생한 승인이 포함될 수 있습니다.

승인은 result.state.approve(...) / result.state.reject(...)를 통해 해결한 다음, 동일한 state를 다시 run()에 전달해 재개하세요. 모든 인터럽션(중단 처리)을 한 번에 해결할 필요는 없습니다. 일부 항목만 처리한 뒤 다시 실행하면, 해결된 호출은 계속 진행될 수 있고 해결되지 않은 호출은 대기 상태로 남아 실행을 다시 일시 중지합니다.

state 속성은 결과의 기반이 되는 직렬화 가능한 스냅샷입니다. 휴먼 인 더 루프 (HITL), 재시도 흐름, 또는 일시 중지된 실행을 나중에 재개해야 하는 모든 경우에 사용하세요.

lastResponseId는 OpenAI Responses API 체이닝을 사용할 때 다음 턴에서 previousResponseId로 전달할 값입니다.

이미 history, session 또는 conversationId로 대화를 이어가고 있다면 일반적으로 lastResponseId는 필요하지 않습니다. 여러 단계로 이루어진 실행의 모든 원문 모델 응답이 필요하다면 대신 rawResponses를 확인하세요.

중첩 에이전트 도구 메타데이터

섹션 제목: “중첩 에이전트 도구 메타데이터”

agentToolInvocation은 중첩 Agent.asTool() 결과를 위한 것으로, 특히 customOutputExtractor 내부에서 현재 도구 호출에 대한 메타데이터가 필요할 때 사용합니다. 일반적인 “전체 실행이 완료되었습니다” 요약 필드가 아닙니다.

이 중첩 컨텍스트에서 agentToolInvocation은 다음을 노출합니다.

  • toolName
  • toolCallId
  • toolArguments

해당 중첩 에이전트 도구 실행에 전달된 구조화된 입력도 필요하다면 result.runContext.toolInput과 함께 사용하세요.

일반적인 최상위 run() 결과에서는 보통 undefined입니다. 이 메타데이터는 런타임 전용이며 RunState에 직렬화되지 않습니다. 주변 패턴은 Agents as tools를 참고하세요.

StreamedRunResult는 위와 동일한 결과 인터페이스를 상속하지만, 스트리밍 전용 제어를 추가합니다.

  • 어시스턴트 텍스트만 가져오는 toTextStream()
  • 전체 이벤트 스트림을 위한 toStream() 또는 for await ... of stream
  • 실행과 모든 후처리 콜백이 끝날 때까지 기다리는 completed
  • 종료 스트리밍 상태를 확인하는 errorcancelled
  • 실행 중 활성 에이전트를 추적하는 currentAgent

스트리밍 실행의 안정화된 최종 상태가 필요하다면 finalOutput, history, interruptions 또는 다른 요약 속성을 읽기 전에 completed를 기다리세요. 이벤트별 처리는 스트리밍을 참고하세요.

스트리밍 실행이 취소되면 정리 작업 후에도 completed는 완료되고 cancelledtrue가 되지만, 현재 턴이 완료되지 않았으므로 finalOutput 같은 턴 종료 필드는 설정되지 않은 채로 남을 수 있습니다. 새 사용자 메시지를 추가하는 대신 result.state(및 사용하는 경우 동일한 session)로 완료되지 않은 해당 턴을 재개하세요.

runContext 속성은 결과에서 실행 컨텍스트를 확인할 수 있는 지원되는 공개 뷰입니다. result.runContext.context는 앱 컨텍스트이며, 같은 객체에는 승인, 사용량, 중첩 toolInput 같은 SDK 관리 런타임 메타데이터도 담깁니다. 전체 구조는 컨텍스트 관리를 참고하세요.

rawResponses에는 실행 중 수집된 원문 모델 응답이 포함됩니다. 여러 단계로 이루어진 실행은 예를 들어 핸드오프나 반복되는 도구/모델 사이클에 걸쳐 둘 이상의 응답을 생성할 수 있습니다.

inputGuardrailResultsoutputGuardrailResults 속성에는 에이전트 수준 가드레일 결과가 포함됩니다. 도구 가드레일 결과는 toolInputGuardrailResultstoolOutputGuardrailResults를 통해 별도로 노출됩니다.

가드레일 결정을 로깅하거나, 가드레일 함수가 반환한 추가 메타데이터를 살펴보거나, 실행이 차단된 이유를 디버그하려는 경우 이 배열을 사용하세요.

토큰 사용량은 result.state.usage에 집계되며, 실행의 요청 수와 토큰 합계를 추적합니다. 동일한 사용량 객체는 result.runContext.usage를 통해서도 사용할 수 있습니다. 스트리밍 실행에서는 응답이 도착할 때마다 이 데이터가 업데이트됩니다.

RunState에서 사용량 읽기
import { Agent, run } from '@openai/agents';
const agent = new Agent({
name: 'Usage Tracker',
instructions: 'Summarize the latest project update in one sentence.',
});
const result = await run(
agent,
'Summarize this: key customer feedback themes and the next product iteration.',
);
const usage = result.state.usage;
console.log({
requests: usage.requests,
inputTokens: usage.inputTokens,
outputTokens: usage.outputTokens,
totalTokens: usage.totalTokens,
});
if (usage.requestUsageEntries) {
for (const entry of usage.requestUsageEntries) {
console.log('request', {
endpoint: entry.endpoint,
inputTokens: entry.inputTokens,
outputTokens: entry.outputTokens,
totalTokens: entry.totalTokens,
});
}
}