GPT-5.6 와 함께 프로그래매틱 툴 콜링(Programmatic Tool Calling)이 출시되어, 에이전트 도구와 도구 사용이 증가함에 따라 모델의 집중력을 유지하는 방법을 다시 정리하기 좋은 시점입니다.
지원 에이전트에게 A-104 주문이 왜 지연되었는지 물어보면, 에이전트는 주문을 확인하고, 배송사에 전화를 걸어 지연 사유를 설명할 수 있습니다. 이 과정에는 모델이 작업을 요청하고, 런타임이 이를 실행하며, 결과가 반환되는 루프가 숨겨져 있습니다. 기본 제공 도구, MCP, 스킬(Skills), 툴 서치(Tool Search), 프로그래매틱 툴 콜링(Programmatic Tool Calling)은 모델이 보는 내용과 반환되는 결과를 변화시킵니다.
1. 툴 콜링 101: 모델이 요청하면, 애플리케이션이 실행합니다
클라이언트 소유 함수를 사용하면 모델이 코드를 직접 실행하지 않습니다. 대신 도구 이름, JSON 인수, 호출 ID를 반환합니다. 애플리케이션이 요청을 확인하고, 함수를 실행한 후, 동일한 ID로 function_call_output을 반환합니다.

클라이언트 소유 도구 루프: 애플리케이션이 3단계를 실행하기 전까지는 외부 작업이 발생하지 않습니다. GPT-Image-2 in Codex로 생성됨.
Python 에서 function_call_output을 반환하면 제어권이 모델로 다시 넘어갑니다:
1import json2from openai import OpenAI34client = OpenAI()56def get_order(order_id): return {"order_id": order_id, "promised_date": "2026-07-13"}78order_tool = {9 "type": "function", "name": "get_order", "strict": True,10 "description": "주문의 약속된 배송 날짜를 반환합니다.",11 "parameters": {12 "type": "object",13 "properties": {"order_id": {"type": "string"}},14 "required": ["order_id"], "additionalProperties": False,15 },16 "output_schema": {17 "type": "object",18 "properties": {19 "order_id": {"type": "string"}, "promised_date": {"type": "string"},20 },21 "required": ["order_id", "promised_date"], "additionalProperties": False,22 },23}2425first = client.responses.create(26 model="gpt-5.6", tools=[order_tool], input="주문 A-104가 왜 늦었나요?",27 tool_choice={"type": "function", "name": "get_order"},28)29call = next(item for item in first.output if item.type == "function_call")30result = get_order(**json.loads(call.arguments))3132final = client.responses.create(33 model="gpt-5.6",34 tools=[order_tool],35 input=[*first.output, {36 "type": "function_call_output",37 "call_id": call.call_id,38 "output": json.dumps(result),39 }],40)41print(final.output_text)
하네스(Harness)는 모델이 최종 메시지를 반환할 때까지 이 루프를 반복합니다. 엄격한 스키마는 인수의 형태를 잘 유지하게 하며, 실행자는 여전히 권한을 확인합니다.
2. 도구 실행은 다양한 위치에서 가능합니다
기본 제공 도구에는 웹 검색, 파일 검색, 호스티드 셸(Hosted Shell)이 포함되며, OpenAI 인프라에서 실행될 수 있습니다. 원격 MCP 서버는 원격으로 도구를 노출하고 실행합니다. Responses는 이러한 서버와 OpenAI 유지 관리 커넥터를 지원하며, 기본적으로 데이터 공유 전 승인을 요청합니다.
스킬(Skill)은 지침과 파일을 묶습니다. 호스티드 셸에 연결하면 모델이 해당 절차를 따르거나 스크립트를 실행할 수 있습니다. 먼저 스킬의 이름, 설명, 경로를 확인하고, 선택 시 SKILL.md를 읽습니다.
1carrier_mcp = {2 "type": "mcp",3 "server_label": "carrier",4 "server_url": "https://example.com/mcp",5 "allowed_tools": ["track_package"],6 "require_approval": "always",7}8incident_shell = {9 "type": "shell",10 "environment": {11 "type": "container_auto",12 "skills": [{"type": "skill_reference", "skill_id": "skill_..."}],13 },14}1516response = client.responses.create(17 model="gpt-5.6",18 tools=[carrier_mcp, incident_shell],19 input="인시던트 스킬을 사용하여 주문 A-104가 지연된 이유를 조사하세요.",20)
하네스는 이러한 표면을 통합합니다. MCP는 원격 도구를 노출하고, 스킬은 절차와 파일을 제공하며, 하네스는 호출이 실행되는 위치를 제어합니다.
3. 툴 서치(Tool Search): 컨텍스트가 제약 조건이 될 때
보이는 모든 도구 정의는 컨텍스트를 차지합니다. 이름, 설명, 스키마는 입력 토큰을 사용하며, 유사한 도구는 구별하기 어려워지고, 대규모 MCP 카탈로그는 큰 프롬프트가 됩니다.
툴 서치를 사용하면 호환되는 GPT-5.4 이상 모델이 필요할 때만 지연된 정의를 로드할 수 있습니다:
1shipping = {2 "type": "namespace", "name": "shipping",3 "description": "주문 추적 및 배송 도구.",4 "tools": [{5 "type": "function", "name": "get_delivery_eta",6 "description": "주문의 예상 도착 시간을 반환합니다.",7 "defer_loading": True,8 "parameters": {9 "type": "object", "required": ["order_id"],10 "properties": {"order_id": {"type": "string"}},11 "additionalProperties": False,12 },13 }],14}1516response = client.responses.create(17 model="gpt-5.6",18 input="주문 A-104는 언제 도착하나요?",19 tools=[shipping, {"type": "tool_search"}],20)
호스티드 툴 서치(Hosted Tool Search)는 요청에 선언된 도구 중에서 선택합니다. 클라이언트 실행 검색은 현재 테넌트 또는 프로젝트에 대한 도구를 반환할 수 있습니다. 검색은 단계를 추가하므로 소규모 카탈로그는 이점이 적을 수 있습니다. 지연된 함수는 여전히 이름과 설명을 노출하는 반면, 네임스페이스나 MCP 서버는 하나의 짧은 설명으로 시작할 수 있습니다. 로드된 도구는 캐시 접두사를 보존하기 위해 추가됩니다. 스킬은 지침과 파일을 지연시키고, 툴 서치는 호출 가능한 스키마를 지연시킵니다.
4. 예측 가능한 다중 도구 작업을 위한 프로그래매틱 툴 콜링(Programmatic Tool Calling)
직접 호출은 각 결과를 모델에 반환합니다. 이는 결과가 다음 결정을 변경할 때 유용하지만, 단순한 조인, 필터, 병렬 조회는 코드가 줄일 수 있는 데이터로 컨텍스트를 채울 수 있습니다.
프로그래매틱 툴 콜링을 사용하면 GPT-5.6이 새롭고 격리된 V8 런타임에서 실행되는 JavaScript를 작성할 수 있습니다. V8은 Chrome 내에서 JavaScript를 실행하지만, 이는 브라우저나 Node.js가 아닙니다. 최상위 await, 루프, 조건문, 병렬 호출을 지원하며, 패키지 설치, 직접 네트워크 액세스, 범용 파일 시스템, 하위 프로세스, 콘솔 또는 영구 상태는 지원하지 않습니다.

격리된 V8 런타임에서 세 번의 직접 호출과 세 번의 병렬 호출 비교. GPT-Image-2 in Codex로 생성됨.
프로그램이 클라이언트 소유 함수에 도달하면 애플리케이션이 호출을 실행하는 동안 일시 중지됩니다. call_id와 caller를 반환하면 재개됩니다. carrier_mcp는 승인을 위해 일시 중지될 수도 있으며, output_schema는 JavaScript가 검사할 수 있는 필드를 알려줍니다.
1for tool in (order_tool, carrier_mcp):2 tool["allowed_callers"] = ["programmatic"]34response = client.responses.create(5 model="gpt-5.6",6 tools=[7 order_tool,8 carrier_mcp,9 {"type": "programmatic_tool_calling"},10 ],11 input="주문 A-104를 배송사 상태와 비교하고 지연 증거를 반환하세요.",12)
프로그램은 함수 및 사용자 정의 도구, MCP, apply_patch, 셸, 코드 인터프리터를 호출할 수 있지만, 웹 검색이나 파일 검색은 호출할 수 없습니다. 최상위 툴 서치는 프로그램이 시작되기 전에 지연된 도구를 로드해야 합니다. 실행 중인 프로그램은 도구를 검색할 수 없습니다.
다음 단계에 모델의 판단, 승인, 인용 또는 부작용이 필요할 때는 직접 호출을 유지하세요. 명확한 규칙을 통해 코드가 증거 손실 없이 더 작은 결과를 반환할 수 있을 때는 프로그램을 사용하세요. 호스티드 실행은 작업이 실행되는 위치를 변경하고, 툴 서치는 컨텍스트에 들어가는 정의를 변경하며, 프로그래매틱 호출은 반환되는 결과를 변경합니다. 평가 결과 정확성은 유지되면서 토큰, 지연 시간 또는 비용이 개선됨을 보여줄 때 이들을 결합하세요.
보너스: 긴 도구 루프를 하나의 연결로 유지하기
에이전트가 모델과 클라이언트 소유 도구 사이를 반복적으로 전환하는 경우, Responses WebSocket 모드는 연속 작업 오버헤드를 줄일 수 있습니다. 소켓은 하네스를 Responses에 연결하며, 도구 실행 속도를 높이지는 않습니다. 함수, MCP, 툴 서치, 프로그래매틱 툴 콜링에 대해 동일한 response.create 필드를 허용하지만, 문서가 모든 조합을 벤치마킹하지는 않습니다. OpenAI는 20회 이상 호출하는 롤아웃에서 최대 40% 더 빠른 실행을 관찰했으므로, 워크플로우를 측정해 보세요.
에이전트로 직접 시도해보세요
이 글의 Appshot을 가져와 Codex 에서 에이전트 프로젝트를 열고 다음을 붙여넣으세요:
이 글과 현재 코드베이스를 사용하여 이 에이전트의 도구 경로를 업그레이드하세요. 크거나 자주 사용되지 않는 도구를 그룹화하고 툴 서치(Tool Search)를 활성화하여 지연시키세요. 프로그래매틱 툴 콜링(Programmatic Tool Calling)이 호출을 병렬로 실행하고 간결한 결과를 반환할 수 있는 경계가 명확한 단계를 찾으세요. 의미론적 결정, 승인, 인용 및 부작용은 직접 호출로 유지하세요. 프로덕션 라우팅을 변경하기 전에 두 경로를 정확성, 증거 범위, 도구 성공률, 토큰, 지연 시간, 재시도 및 비용 측면에서 비교하세요.





