Movatterモバイル変換


[0]ホーム

URL:


콘텐츠로 이동

도구

도구는 에이전트가 동작을 수행하도록 합니다. 예: 데이터 가져오기, 코드 실행, 외부 API 호출, 심지어 컴퓨터 사용까지. Agents SDK 에는 세 가지 클래스의 도구가 있습니다:

  • Hosted tools: 이는 AI 모델과 함께 LLM 서버에서 실행됩니다. OpenAI 는 retrieval, 웹 검색 및 컴퓨터 사용을 호스티드 툴로 제공합니다
  • 함수 호출: 임의의 Python 함수를 도구로 사용할 수 있습니다
  • 도구로서의 에이전트: 에이전트를 도구로 사용하여 핸드오프 없이 다른 에이전트를 호출할 수 있습니다

호스티드 툴

OpenAI 는OpenAIResponsesModel 사용 시 몇 가지 기본 제공 도구를 제공합니다:

  • WebSearchTool은 에이전트가 웹을 검색하도록 합니다
  • FileSearchTool은 OpenAI 벡터 스토어에서 정보를 검색할 수 있도록 합니다
  • ComputerTool은 컴퓨터 사용 작업을 자동화합니다
  • CodeInterpreterTool은 LLM 이 샌드박스 환경에서 코드를 실행하도록 합니다
  • HostedMCPTool은 원격 MCP 서버의 도구를 모델에 노출합니다
  • ImageGenerationTool은 프롬프트로부터 이미지를 생성합니다
  • LocalShellTool은 로컬 머신에서 셸 명령을 실행합니다
fromagentsimportAgent,FileSearchTool,Runner,WebSearchToolagent=Agent(name="Assistant",tools=[WebSearchTool(),FileSearchTool(max_num_results=3,vector_store_ids=["VECTOR_STORE_ID"],),],)asyncdefmain():result=awaitRunner.run(agent,"Which coffee shop should I go to, taking into account my preferences and the weather today in SF?")print(result.final_output)

함수 도구

임의의 Python 함수를 도구로 사용할 수 있습니다. Agents SDK 가 도구를 자동으로 설정합니다:

  • 도구 이름은 Python 함수 이름이 됩니다(또는 직접 이름을 지정할 수 있음)
  • 도구 설명은 함수의 독스트링에서 가져옵니다(또는 직접 설명을 제공할 수 있음)
  • 함수 입력에 대한 스키마는 함수의 인수로부터 자동으로 생성됩니다
  • 각 입력의 설명은 비활성화하지 않는 한 함수의 독스트링에서 가져옵니다

Python 의inspect 모듈로 함수 시그니처를 추출하고, 독스트링 파싱에는griffe 를, 스키마 생성에는pydantic 을 사용합니다.

importjsonfromtyping_extensionsimportTypedDict,AnyfromagentsimportAgent,FunctionTool,RunContextWrapper,function_toolclassLocation(TypedDict):lat:floatlong:float@function_tool# (1)!asyncdeffetch_weather(location:Location)->str:# (2)!"""Fetch the weather for a given location.    Args:        location: The location to fetch the weather for.    """# In real life, we'd fetch the weather from a weather APIreturn"sunny"@function_tool(name_override="fetch_data")# (3)!defread_file(ctx:RunContextWrapper[Any],path:str,directory:str|None=None)->str:"""Read the contents of a file.    Args:        path: The path to the file to read.        directory: The directory to read the file from.    """# In real life, we'd read the file from the file systemreturn"<file contents>"agent=Agent(name="Assistant",tools=[fetch_weather,read_file],# (4)!)fortoolinagent.tools:ifisinstance(tool,FunctionTool):print(tool.name)print(tool.description)print(json.dumps(tool.params_json_schema,indent=2))print()
  1. 함수의 인수로 임의의 Python 타입을 사용할 수 있으며, 함수는 동기 또는 비동기일 수 있습니다
  2. 독스트링이 있으면 설명과 인수 설명을 추출하는 데 사용됩니다
  3. 선택적으로context 를 받을 수 있습니다(첫 번째 인수여야 함). 또한 도구 이름, 설명, 사용할 독스트링 스타일 등 여러 오버라이드를 설정할 수 있습니다
  4. 데코레이트된 함수를 도구 목록에 전달하면 됩니다
출력을 보려면 펼치기
fetch_weatherFetch the weather for a given location.{"$defs": {  "Location": {    "properties": {      "lat": {        "title": "Lat",        "type": "number"      },      "long": {        "title": "Long",        "type": "number"      }    },    "required": [      "lat",      "long"    ],    "title": "Location",    "type": "object"  }},"properties": {  "location": {    "$ref": "#/$defs/Location",    "description": "The location to fetch the weather for."  }},"required": [  "location"],"title": "fetch_weather_args","type": "object"}fetch_dataRead the contents of a file.{"properties": {  "path": {    "description": "The path to the file to read.",    "title": "Path",    "type": "string"  },  "directory": {    "anyOf": [      {        "type": "string"      },      {        "type": "null"      }    ],    "default": null,    "description": "The directory to read the file from.",    "title": "Directory"  }},"required": [  "path"],"title": "fetch_data_args","type": "object"}

함수 도구에서 이미지나 파일 반환

텍스트 출력 외에도, 함수 도구의 출력으로 하나 이상의 이미지 또는 파일을 반환할 수 있습니다. 이를 위해 다음 중 하나를 반환할 수 있습니다:

맞춤형 함수 도구

때로는 Python 함수를 도구로 사용하고 싶지 않을 수 있습니다. 이 경우 직접FunctionTool 을 생성할 수 있습니다. 다음을 제공해야 합니다:

  • name
  • description
  • 인수에 대한 JSON 스키마인params_json_schema
  • ToolContext 와 JSON 문자열의 인수를 받아 도구 출력을 문자열로 반환해야 하는 비동기 함수on_invoke_tool
fromtypingimportAnyfrompydanticimportBaseModelfromagentsimportRunContextWrapper,FunctionTooldefdo_some_work(data:str)->str:return"done"classFunctionArgs(BaseModel):username:strage:intasyncdefrun_function(ctx:RunContextWrapper[Any],args:str)->str:parsed=FunctionArgs.model_validate_json(args)returndo_some_work(data=f"{parsed.username} is{parsed.age} years old")tool=FunctionTool(name="process_user",description="Processes extracted user data",params_json_schema=FunctionArgs.model_json_schema(),on_invoke_tool=run_function,)

인수 및 독스트링 자동 파싱

앞서 언급했듯이, 도구의 스키마를 추출하기 위해 함수 시그니처를 자동으로 파싱하고, 도구와 개별 인수에 대한 설명을 추출하기 위해 독스트링을 파싱합니다. 이에 대한 몇 가지 참고 사항:

  1. 시그니처 파싱은inspect 모듈을 통해 수행됩니다. 타입 힌트를 사용해 인수 타입을 파악하고, 전체 스키마를 표현하는 Pydantic 모델을 동적으로 구축합니다. Python 기본 타입, Pydantic 모델, TypedDict 등 대부분의 타입을 지원합니다
  2. 독스트링 파싱에는griffe 를 사용합니다. 지원되는 독스트링 형식은google,sphinx,numpy 입니다. 독스트링 형식을 자동으로 감지하려고 시도하지만, 최선의 노력이므로function_tool 호출 시 명시적으로 설정할 수 있습니다. 또한use_docstring_infoFalse 로 설정해 독스트링 파싱을 비활성화할 수 있습니다

스키마 추출 코드는agents.function_schema 에 있습니다.

도구로서의 에이전트

일부 워크플로에서는 제어를 핸드오프하지 않고, 중앙 에이전트가 특화된 에이전트 네트워크를 멀티 에이전트 오케스트레이션 하도록 하고 싶을 수 있습니다. 이를 위해 에이전트를 도구로 모델링할 수 있습니다.

fromagentsimportAgent,Runnerimportasynciospanish_agent=Agent(name="Spanish agent",instructions="You translate the user's message to Spanish",)french_agent=Agent(name="French agent",instructions="You translate the user's message to French",)orchestrator_agent=Agent(name="orchestrator_agent",instructions=("You are a translation agent. You use the tools given to you to translate.""If asked for multiple translations, you call the relevant tools."),tools=[spanish_agent.as_tool(tool_name="translate_to_spanish",tool_description="Translate the user's message to Spanish",),french_agent.as_tool(tool_name="translate_to_french",tool_description="Translate the user's message to French",),],)asyncdefmain():result=awaitRunner.run(orchestrator_agent,input="Say 'Hello, how are you?' in Spanish.")print(result.final_output)

툴-에이전트 사용자 지정

agent.as_tool 함수는 에이전트를 손쉽게 도구로 전환하기 위한 편의 메서드입니다. 다만 모든 구성을 지원하지는 않습니다. 예를 들어max_turns 를 설정할 수 없습니다. 고급 사용 사례에서는 도구 구현 내에서Runner.run 을 직접 사용하세요:

@function_toolasyncdefrun_my_agent()->str:"""A tool that runs the agent with custom configs"""agent=Agent(name="My agent",instructions="...")result=awaitRunner.run(agent,input="...",max_turns=5,run_config=...)returnstr(result.final_output)

맞춤 출력 추출

특정 경우, 중앙 에이전트에 반환하기 전에 툴-에이전트의 출력을 수정하고 싶을 수 있습니다. 다음과 같은 경우에 유용합니다:

  • 하위 에이전트의 대화 기록에서 특정 정보(예: JSON 페이로드)를 추출
  • 에이전트의 최종 답변을 변환 또는 재포맷(예: 마크다운을 일반 텍스트 또는 CSV 로 변환)
  • 에이전트의 응답이 누락되었거나 잘못된 경우 출력을 검증하거나 대체값 제공

as_tool 메서드에custom_output_extractor 인수를 제공하여 이를 수행할 수 있습니다:

asyncdefextract_json_payload(run_result:RunResult)->str:# Scan the agent’s outputs in reverse order until we find a JSON-like message from a tool call.foriteminreversed(run_result.new_items):ifisinstance(item,ToolCallOutputItem)anditem.output.strip().startswith("{"):returnitem.output.strip()# Fallback to an empty JSON object if nothing was foundreturn"{}"json_tool=data_agent.as_tool(tool_name="get_data_json",tool_description="Run the data agent and return only its JSON payload",custom_output_extractor=extract_json_payload,)

중첩 에이전트 실행 스트리밍

as_toolon_stream 콜백을 전달하여, 스트림이 완료된 후 최종 출력을 반환하면서도 중첩 에이전트가 내보내는 스트리밍 이벤트를 수신할 수 있습니다.

fromagentsimportAgentToolStreamEventasyncdefhandle_stream(event:AgentToolStreamEvent)->None:# Inspect the underlying StreamEvent along with agent metadata.print(f"[stream]{event['agent']['name']} ::{event['event'].type}")billing_agent_tool=billing_agent.as_tool(tool_name="billing_helper",tool_description="Answer billing questions.",on_stream=handle_stream,# Can be sync or async.)

예상 동작:

  • 이벤트 타입은StreamEvent["type"] 을 반영합니다:raw_response_event,run_item_stream_event,agent_updated_stream_event
  • on_stream 을 제공하면 중첩 에이전트가 자동으로 스트리밍 모드로 실행되며, 최종 출력을 반환하기 전에 스트림이 소진됩니다
  • 핸들러는 동기 또는 비동기일 수 있으며, 각 이벤트는 도착 순서대로 전달됩니다
  • 도구가 모델의 tool call 을 통해 호출되면tool_call_id 가 존재하며, 직접 호출의 경우None 일 수 있습니다
  • 완전한 실행 가능한 샘플은examples/agent_patterns/agents_as_tools_streaming.py 를 참조하세요

조건부 도구 활성화

런타임에is_enabled 매개변수를 사용하여 에이전트 도구를 조건부로 활성화하거나 비활성화할 수 있습니다. 이를 통해 컨텍스트, 사용자 선호도 또는 런타임 조건에 따라 LLM 에서 사용할 수 있는 도구를 동적으로 필터링할 수 있습니다.

importasynciofromagentsimportAgent,AgentBase,Runner,RunContextWrapperfrompydanticimportBaseModelclassLanguageContext(BaseModel):language_preference:str="french_spanish"deffrench_enabled(ctx:RunContextWrapper[LanguageContext],agent:AgentBase)->bool:"""Enable French for French+Spanish preference."""returnctx.context.language_preference=="french_spanish"# Create specialized agentsspanish_agent=Agent(name="spanish_agent",instructions="You respond in Spanish. Always reply to the user's question in Spanish.",)french_agent=Agent(name="french_agent",instructions="You respond in French. Always reply to the user's question in French.",)# Create orchestrator with conditional toolsorchestrator=Agent(name="orchestrator",instructions=("You are a multilingual assistant. You use the tools given to you to respond to users. ""You must call ALL available tools to provide responses in different languages. ""You never respond in languages yourself, you always use the provided tools."),tools=[spanish_agent.as_tool(tool_name="respond_spanish",tool_description="Respond to the user's question in Spanish",is_enabled=True,# Always enabled),french_agent.as_tool(tool_name="respond_french",tool_description="Respond to the user's question in French",is_enabled=french_enabled,),],)asyncdefmain():context=RunContextWrapper(LanguageContext(language_preference="french_spanish"))result=awaitRunner.run(orchestrator,"How are you?",context=context.context)print(result.final_output)asyncio.run(main())

is_enabled 매개변수는 다음을 허용합니다:

  • Boolean 값:True(항상 활성) 또는False(항상 비활성)
  • 호출 가능한 함수:(context, agent) 를 받아 boolean 을 반환하는 함수
  • 비동기 함수: 복잡한 조건 로직을 위한 async 함수

비활성화된 도구는 런타임에 LLM 에 완전히 숨겨지므로 다음에 유용합니다:

  • 사용자 권한에 따른 기능 게이팅
  • 환경별 도구 가용성(dev vs prod)
  • 서로 다른 도구 구성을 A/B 테스트
  • 런타임 상태에 따른 동적 도구 필터링

함수 도구의 오류 처리

@function_tool 로 함수 도구를 만들 때failure_error_function 을 전달할 수 있습니다. 이는 도구 호출이 크래시할 경우 LLM 에 오류 응답을 제공하는 함수입니다.

  • 기본적으로(즉, 아무 것도 전달하지 않으면) 오류가 발생했음을 LLM 에 알리는default_tool_error_function 이 실행됩니다
  • 자체 오류 함수를 전달하면 해당 함수가 대신 실행되어 그 응답이 LLM 에 전송됩니다
  • 명시적으로None 을 전달하면, 도구 호출 오류가 다시 발생하도록 하여 직접 처리할 수 있습니다. 모델이 잘못된 JSON 을 생성한 경우ModelBehaviorError, 코드가 크래시한 경우UserError 등이 될 수 있습니다
fromagentsimportfunction_tool,RunContextWrapperfromtypingimportAnydefmy_custom_error_function(context:RunContextWrapper[Any],error:Exception)->str:"""A custom function to provide a user-friendly error message."""print(f"A tool call failed with the following error:{error}")return"An internal server error occurred. Please try again later."@function_tool(failure_error_function=my_custom_error_function)defget_user_profile(user_id:str)->str:"""Fetches a user profile from a mock API.     This function demonstrates a 'flaky' or failing API call.    """ifuser_id=="user_123":return"User profile for user_123 successfully retrieved."else:raiseValueError(f"Could not retrieve profile for user_id:{user_id}. API returned an error.")

수동으로FunctionTool 객체를 생성하는 경우,on_invoke_tool 함수 내부에서 오류를 처리해야 합니다.


[8]ページ先頭

©2009-2025 Movatter.jp