함수 도구를 사용하면 에이전트가 애플리케이션 코드를 호출할 수 있습니다. 개발자는 함수와 인자를 정의합니다. 에이전트가 함수 호출을 요청하고 애플리케이션 코드가 결과를 반환하면 하네스가 턴을 이어갑니다.
핸들러는 애플리케이션 서버, 워커 또는 직접 관리하는 환경에서 실행할 수 있습니다. 세션에 환경을 연결해도 그 환경에서 함수 도구가 자동으로 실행되지는 않습니다.
Responses API의 함수 호출을 사용하고 있다면 여기서 설명하는 세션 플로우에서도 기존 함수 구현을 재사용할 수 있습니다.
함수 정의하기
agent.tools에 함수 정의를 추가하는 작업은 에이전트를 구성할 때 수행하세요. 함수 이름과 설명을 지정하고 인자의 JSON 스키마를 정의하세요.
{
"type": "function",
"name": "get_customer",
"description": "Look up a customer by ID.",
"parameters": {
"type": "object",
"properties": { "customer_id": { "type": "string" } },
"required": ["customer_id"],
"additionalProperties": false
}
}
필요한 작업 처리하기
에이전트에 함수 결과가 필요하면 세션에서 agent.session.requires_action 이벤트가 발생합니다. event.session.required_actions에서 대기 중인 호출을 확인하세요. 스트리밍 없이도 세션을 조회해 session.required_actions를 확인할 수 있습니다.
required_actions의 함수 호출 항목은 다음과 같습니다.
{
"type": "function_call",
"turn_id": "turn_123",
"call_id": "call_123",
"name": "get_customer",
"arguments": { "customer_id": "123" }
}
지정된 이름의 함수에 전달받은 인자를 넣어 실행하세요. 어떤 호출에 결과를 반환해야 하는지는 required_actions에서 확인하세요. 세션 기록에 function_call 항목이 있다는 사실만으로는 해당 호출이 아직 결과를 기다리고 있는지 알 수 없습니다.
결과 반환하기
agent.session.input.tool_result를 세션 이벤트 엔드포인트로 보내세요. 대기 중인 작업에서 turn_id와 call_id를 복사하세요.
- 성공하면
success: true로 설정하고output에 문자열이나 지원되는 형식의 콘텐츠 배열을 전달하세요. JSON 객체는 문자열로 직렬화하세요. - 오류가 발생하면
success: false로 설정하고error에 에이전트가 활용할 수 있는 오류 메시지를 전달하세요.
대기 중인 get_customer 호출마다 고객 정보를 조회하고 그 결과를 반환하세요. 다음 예제에서 action은 required_actions에 있는 항목입니다.
const result = {
turn_id: action.turn_id,
call_id: action.call_id,
};
let outcome;
outcome = {
success: true,
output: JSON.stringify(getCustomer(action.arguments)),
};
await client.beta.agents.sessions.events.create(sessionId, {
events: [
{ type: "agent.session.input.tool_result", ...result, ...outcome },
],
});하네스는 필요한 결과를 받으면 턴을 이어갑니다. 세션 이벤트 및 항목을 추적해 턴이 어떻게 끝났는지 확인하고 출력을 가져오세요.
결과 크기
도구 결과가 너무 커서 API가 거부하면 결과 크기를 4 MiB(4,194,304바이트) 미만으로 줄이세요. 이때 Agents API 메타데이터를 위한 여유 공간을 조금 남겨 두세요. 호출이 아직 대기 중일 때 같은 turn_id와 call_id로 다시 시도하세요.
연결이 끊긴 후 복구하기
세션을 조회해 대기 중인 작업을 확인하세요. 이미 함수를 실행했다면 같은 turn_id와 call_id로 저장해 둔 결과를 제출하세요.
사이드 이펙트가 있는 함수는 세션 ID, 턴 ID, 호출 ID를 기준으로 결과를 영구 저장소에 보관하세요. 함수가 정상적으로 실행됐을 가능성이 있는데 저장된 결과가 없다면, 함수를 다시 실행하기 전에 실행 결과를 확인하세요.
필요할 때 함수 로드하기
기본적으로 함수는 미리 로드됩니다. 함수 로드를 미루려면 함수 정의에 defer_loading: true를 설정하고 { "type": "tool_search" }를 agent.tools에 추가하세요. 전체 예제는 도구 검색을 참고하세요.