CrewAI 도구는 웹 검색과 데이터 분석부터 협업 및 동료 간 업무 위임에 이르는 다양한 기능을 에이전트에게 제공한다. 이 문서에서는 CrewAI 프레임워크 내에서 이러한 도구를 생성, 통합, 활용하는 방법을 설명하며, 특히 협업 도구에 초점을 맞춘 새로운 내용을 다룬다.
CrewAI에서 도구는 에이전트가 다양한 작업을 수행하기 위해 활용할 수 있는 기능이나 함수를 의미한다. 이는 CrewAI Toolkit과 LangChain Tools에서 제공하는 도구를 포함하며, 단순한 검색부터 복잡한 상호작용, 그리고 에이전트 간의 효과적인 협업까지 가능하게 한다.
에이전트의 기능을 강화하기 위해 crewAI 도구를 사용하려면 먼저 추가 도구 패키지를 설치한다:
pip install 'crewai[tools]'
다음은 이 도구를 사용하는 예제이다:
import osfrom crewai import Agent, Task, Crew# crewAI 도구 임포트from crewai_tools import ( DirectoryReadTool, FileReadTool, SerperDevTool, WebsiteSearchTool)# API 키 설정os.environ["SERPER_API_KEY"] = "Your Key" # serper.dev API 키os.environ["OPENAI_API_KEY"] = "Your Key"# 도구 인스턴스 생성docs_tool = DirectoryReadTool(directory='./blog-posts')file_tool = FileReadTool()search_tool = SerperDevTool()web_rag_tool = WebsiteSearchTool()# 에이전트 생성researcher = Agent( role='시장 조사 분석가', goal='AI 산업의 최신 시장 분석 제공', backstory='시장 트렌드를 꿰뚫어 보는 전문 분석가', tools=[search_tool, web_rag_tool], verbose=True)writer = Agent( role='콘텐츠 작가', goal='AI 산업에 대한 흥미로운 블로그 글 작성', backstory='기술에 열정을 가진 숙련된 작가', tools=[docs_tool, file_tool], verbose=True)# 작업 정의research = Task( description='AI 산업의 최신 트렌드를 조사하고 요약 제공', expected_output='AI 산업의 상위 3개 트렌드 개발 동향과 그 중요성에 대한 독창적인 관점을 담은 요약', agent=researcher)write = Task( description='조사 분석가의 요약을 바탕으로 AI 산업에 대한 흥미로운 블로그 글 작성. 최신 블로그 글에서 영감을 얻는다.', expected_output='복잡한 전문 용어를 피하고, 흥미롭고 정보가 풍부하며 접근 가능한 콘텐츠로 구성된 4단락의 마크다운 형식 블로그 글', agent=writer, output_file='blog-posts/new_post.md' # 최종 블로그 글 저장 위치)# 플래닝 기능을 활성화한 크루 구성crew = Crew( agents=[researcher, writer], tasks=[research, write], verbose=True, planning=True, # 플래닝 기능 활성화)# 작업 실행crew.kickoff()
from crewai.tools import tool@tool("내 도구 이름")def my_tool(question: str) -> str: """이 도구가 어떤 용도로 사용되는지 명확히 설명한다. 에이전트가 이를 사용하려면 이 정보가 필요하다.""" # 함수 로직 작성 return "커스텀 도구의 결과"
StructuredTool.from_function을 사용해 외부 API나 시스템과 상호작용하는 함수를 감싸면 구조화된 인터페이스를 제공할 수 있다. 이를 통해 강력한 검증과 일관된 실행이 가능해지며, 복잡한 기능을 애플리케이션에 통합하기가 더 쉬워진다. 다음 예제에서 이를 확인할 수 있다:
from crewai.tools.structured_tool import CrewStructuredToolfrom pydantic import BaseModel# Pydantic을 사용해 도구의 입력 스키마 정의class APICallInput(BaseModel): endpoint: str parameters: dict# API 호출을 실행하는 래퍼 함수def tool_wrapper(*args, **kwargs): # 여기서는 일반적으로 매개변수를 사용해 API를 호출 # 예시를 위해 플레이스홀더 문자열 반환 return f"Call the API at {kwargs['endpoint']} with parameters {kwargs['parameters']}"# 구조화된 도구 생성 및 반환def create_structured_tool(): return CrewStructuredTool.from_function( name='Wrapper API', description="구조화된 입력으로 API 호출을 감싸는 도구.", args_schema=APICallInput, func=tool_wrapper, )# 예시 사용법structured_tool = create_structured_tool()# 구조화된 입력으로 도구 실행result = structured_tool._run(**{ "endpoint": "https://example.com/api", "parameters": {"key1": "value1", "key2": "value2"}})print(result) # 출력: Call the API at https://example.com/api with parameters {'key1': 'value1', 'key2': 'value2'}
도구는 선택적으로 cache_function을 구현해 캐싱 동작을 파인튜닝할 수 있다. 이 함수는 특정 조건에 따라 결과를 캐시할 시점을 결정하며, 캐싱 로직에 대한 세밀한 제어를 제공한다.
from crewai.tools import tool@tooldef multiplication_tool(first_number: int, second_number: int) -> str: """두 숫자를 곱해야 할 때 유용한 도구이다.""" return first_number * second_numberdef cache_func(args, result): # 이 경우, 결과가 2의 배수일 때만 캐시한다 cache = result % 2 == 0 return cachemultiplication_tool.cache_function = cache_funcwriter1 = Agent( role="Writer", goal="어린이를 위한 수학 교재를 작성한다.", backstory="글쓰기 전문가이며 아이들을 가르치는 것을 좋아하지만, 수학에 대한 지식은 전무하다.", tools=[multiplication_tool], allow_delegation=False, ) #...
CrewAI 에이전트의 능력을 확장하는 데 도구는 매우 중요하다. 도구를 활용하면 다양한 작업을 수행하고 효과적으로 협업할 수 있다. CrewAI로 솔루션을 구축할 때는 커스텀 도구와 기존 도구를 모두 활용해 에이전트의 능력을 강화하고 AI 생태계를 발전시켜야 한다. 에러 처리, 캐싱 메커니즘, 도구 인자의 유연성을 고려해 에이전트의 성능과 기능을 최적화한다.
{"docsConfig":{"$schema":"https://mintlify.com/docs.json","theme":"mint","name":"CrewAI","colors":{"primary":"#EB6658","light":"#F3A78B","dark":"#C94C3C"},"favicon":"favicon.svg","logo":{"light":"https://mintcdn.com/burtk/rNQc_sgW_NZiUz5g/crew_only_logo.png?fit=max\u0026auto=format\u0026n=rNQc_sgW_NZiUz5g\u0026q=85\u0026s=416de478f9659f33187a270b65cd8692","dark":"https://mintcdn.com/burtk/rNQc_sgW_NZiUz5g/crew_only_logo.png?fit=max\u0026auto=format\u0026n=rNQc_sgW_NZiUz5g\u0026q=85\u0026s=416de478f9659f33187a270b65cd8692"},"appearance":{"default":"dark","strict":false},"navbar":{"primary":{"type":"github","href":"https://github.com/crewAIInc/crewAI"}},"search":{"prompt":"Search CrewAI docs"},"seo":{"indexing":"navigable"},"footer":{"socials":{"website":"https://crewai.com","x":"https://x.com/crewAIInc","github":"https://github.com/crewAIInc/crewAI","linkedin":"https://www.linkedin.com/company/crewai-inc","youtube":"https://youtube.com/@crewAIInc"}},"navigation":{"global":{"anchors":[{"anchor":"Community","href":"https://community.crewai.com","icon":"discourse"},{"anchor":"Changelog","href":"https://github.com/crewAIInc/crewAI/releases","icon":"timeline"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"burtk","hasAudioNarration":false,"actualSubdomain":"burtk","customDomains":["crewai.burt.pe.kr"],"gitSource":{"type":"github","owner":"skyfe79","repo":"crewai-dev-docs","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a21e68f044dd579e9b57b28","collectionId":"1fdb12df-1617-45b8-8d8f-6adc9443d8ef","schemaVersion":"v2"},"entitlements":{},"buildId":"6a21e68f044dd579e9b57b28:success","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Get Started","count":75},{"language":"default","tag":"Tools","count":32},{"language":"default","tag":"How to Guides","count":20},{"language":"default","tag":"Core Concepts","count":16},{"language":"default","tag":"Examples","count":2},{"language":"default","tag":"Telemetry","count":1}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"concepts/tools","slug":"/concepts/tools","pageMetadata":{"title":"도구","description":"에이전트 협업과 작업 실행을 위해 CrewAI 프레임워크 내 도구를 이해하고 활용하는 방법.","icon":"screwdriver-wrench","href":"/concepts/tools"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"에이전트 협업과 작업 실행을 위해 CrewAI 프레임워크 내 도구를 이해하고 활용하는 방법.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`소개`,children:`소개`}),`\n`,_jsx(_components.p,{children:`CrewAI 도구는 웹 검색과 데이터 분석부터 협업 및 동료 간 업무 위임에 이르는 다양한 기능을 에이전트에게 제공한다. 이 문서에서는 CrewAI 프레임워크 내에서 이러한 도구를 생성, 통합, 활용하는 방법을 설명하며, 특히 협업 도구에 초점을 맞춘 새로운 내용을 다룬다.`}),`\n`,_jsx(Heading,{level:`2`,id:`도구란-무엇인가`,children:`도구란 무엇인가?`}),`\n`,_jsxs(_components.p,{children:[`CrewAI에서 도구는 에이전트가 다양한 작업을 수행하기 위해 활용할 수 있는 기능이나 함수를 의미한다. 이는 `,_jsx(_components.a,{href:`https://github.com/joaomdmoura/crewai-tools`,children:`CrewAI Toolkit`}),`과 `,_jsx(_components.a,{href:`https://python.langchain.com/docs/integrations/tools`,children:`LangChain Tools`}),`에서 제공하는 도구를 포함하며, 단순한 검색부터 복잡한 상호작용, 그리고 에이전트 간의 효과적인 협업까지 가능하게 한다.`]}),`\n`,_jsx(Heading,{level:`2`,id:`도구의-주요-특징`,children:`도구의 주요 특징`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`유용성`}),`: 웹 검색, 데이터 분석, 콘텐츠 생성, 에이전트 협업과 같은 작업을 위해 설계됨`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`통합성`}),`: 도구를 에이전트의 워크플로우에 원활하게 통합해 기능을 강화함`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`커스터마이징`}),`: 특정 요구 사항에 맞게 커스텀 도구를 개발하거나 기존 도구를 활용할 수 있는 유연성을 제공함`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`오류 처리`}),`: 원활한 운영을 보장하기 위해 견고한 오류 처리 메커니즘을 내장함`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`캐싱 메커니즘`}),`: 성능 최적화와 중복 작업 감소를 위해 지능형 캐싱 기능을 탑재함`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`crewai-도구-사용하기`,children:`CrewAI 도구 사용하기`}),`\n`,_jsx(_components.p,{children:`에이전트의 기능을 강화하기 위해 crewAI 도구를 사용하려면 먼저 추가 도구 패키지를 설치한다:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`pip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'crewai[tools]'`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`다음은 이 도구를 사용하는 예제이다:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`61`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`61`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` os`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` crewai `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Agent, Task, Crew`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# crewAI 도구 임포트`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` crewai_tools `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` DirectoryReadTool,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` FileReadTool,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` SerperDevTool,`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` WebsiteSearchTool`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# API 키 설정`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`os.environ[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"SERPER_API_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Your Key\"`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # serper.dev API 키`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`os.environ[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"OPENAI_API_KEY\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`] `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Your Key\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 도구 인스턴스 생성`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`docs_tool `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` DirectoryReadTool(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`directory`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'./blog-posts'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`file_tool `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` FileReadTool()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`search_tool `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` SerperDevTool()`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`web_rag_tool `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` WebsiteSearchTool()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 에이전트 생성`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`researcher `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Agent(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` role`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'시장 조사 분석가'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` goal`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'AI 산업의 최신 시장 분석 제공'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` backstory`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'시장 트렌드를 꿰뚫어 보는 전문 분석가'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` tools`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[search_tool, web_rag_tool],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` verbose`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`True`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`writer `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Agent(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` role`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'콘텐츠 작가'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` goal`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'AI 산업에 대한 흥미로운 블로그 글 작성'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` backstory`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'기술에 열정을 가진 숙련된 작가'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` tools`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[docs_tool, file_tool],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` verbose`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`True`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 작업 정의`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`research `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Task(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` description`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'AI 산업의 최신 트렌드를 조사하고 요약 제공'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` expected_output`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'AI 산업의 상위 3개 트렌드 개발 동향과 그 중요성에 대한 독창적인 관점을 담은 요약'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` agent`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`researcher`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`write `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Task(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` description`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'조사 분석가의 요약을 바탕으로 AI 산업에 대한 흥미로운 블로그 글 작성. 최신 블로그 글에서 영감을 얻는다.'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` expected_output`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'복잡한 전문 용어를 피하고, 흥미롭고 정보가 풍부하며 접근 가능한 콘텐츠로 구성된 4단락의 마크다운 형식 블로그 글'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` agent`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`writer,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` output_file`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'blog-posts/new_post.md'`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # 최종 블로그 글 저장 위치`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 플래닝 기능을 활성화한 크루 구성`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`crew `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Crew(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` agents`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[researcher, writer],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` tasks`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[research, write],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` verbose`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`True`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` planning`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`True`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 플래닝 기능 활성화`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 작업 실행`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`crew.kickoff()`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`사용-가능한-crewai-도구`,children:`사용 가능한 CrewAI 도구`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`에러 처리`}),`: 모든 도구는 에러 처리 기능을 내장하고 있어, 에이전트가 예외 상황을 우아하게 처리하고 작업을 계속할 수 있다.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`캐싱 메커니즘`}),`: 모든 도구는 캐싱을 지원하며, 이전에 얻은 결과를 효율적으로 재사용할 수 있다. 이를 통해 외부 리소스에 대한 부하를 줄이고 실행 시간을 단축한다. 또한 `,_jsx(_components.code,{children:`cache_function`}),` 속성을 사용해 캐싱 메커니즘을 더 세밀하게 제어할 수 있다.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`다음은 사용 가능한 도구와 그 설명이다:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`도구`}),_jsx(_components.th,{style:{textAlign:`left`},children:`설명`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`BrowserbaseLoadTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`웹 브라우저와 상호작용하고 데이터를 추출하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`CodeDocsSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`코드 문서 및 관련 기술 문서를 검색하기에 최적화된 RAG 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`CodeInterpreterTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`파이썬 코드를 해석하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`ComposioTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Composio 도구를 사용할 수 있게 하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`CSVSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`CSV 파일 내에서 검색하기 위해 설계된 RAG 도구로, 구조화된 데이터를 처리한다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`DALL-E Tool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`DALL-E API를 사용해 이미지를 생성하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`DirectorySearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`디렉토리 내에서 검색하기 위한 RAG 도구로, 파일 시스템 탐색에 유용하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`DOCXSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`DOCX 문서 내에서 검색하기 위한 RAG 도구로, Word 파일 처리에 적합하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`DirectoryReadTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`디렉토리 구조와 그 내용을 읽고 처리하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`EXASearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`다양한 데이터 소스에서 철저한 검색을 수행하기 위해 설계된 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`FileReadTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`다양한 파일 형식을 지원하며 파일에서 데이터를 읽고 추출하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`FirecrawlSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Firecrawl을 사용해 웹페이지를 검색하고 결과를 반환하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`FirecrawlCrawlWebsiteTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Firecrawl을 사용해 웹페이지를 크롤링하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`FirecrawlScrapeWebsiteTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`Firecrawl을 사용해 웹페이지 URL을 스크랩하고 그 내용을 반환하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`GithubSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`GitHub 저장소 내에서 검색하기 위한 RAG 도구로, 코드 및 문서 검색에 유용하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`SerperDevTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`개발 목적으로 특화된 도구로, 개발 중인 특정 기능을 제공한다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`TXTSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`텍스트 (.txt) 파일 내에서 검색하기 위한 RAG 도구로, 비구조화된 데이터 처리에 적합하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`JSONSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`JSON 파일 내에서 검색하기 위해 설계된 RAG 도구로, 구조화된 데이터 처리에 적합하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`LlamaIndexTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`LlamaIndex 도구를 사용할 수 있게 하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`MDXSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`마크다운 (MDX) 파일 내에서 검색하기 위한 RAG 도구로, 문서 처리에 유용하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`PDFSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`PDF 문서 내에서 검색하기 위한 RAG 도구로, 스캔된 문서 처리에 적합하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`PGSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`PostgreSQL 데이터베이스 내에서 검색하기 위해 최적화된 RAG 도구로, 데이터베이스 쿼리에 적합하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`Vision Tool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`DALL-E API를 사용해 이미지를 생성하는 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`RagTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`다양한 데이터 소스와 타입을 처리할 수 있는 범용 RAG 도구.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`ScrapeElementFromWebsiteTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`웹사이트에서 특정 엘리먼트를 스크랩하는 도구로, 특정 데이터 추출에 유용하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`ScrapeWebsiteTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`전체 웹사이트를 스크랩하는 도구로, 포괄적인 데이터 수집에 적합하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`WebsiteSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`웹사이트 콘텐츠를 검색하기 위한 RAG 도구로, 웹 데이터 추출에 최적화되어 있다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`XMLSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`XML 파일 내에서 검색하기 위해 설계된 RAG 도구로, 구조화된 데이터 형식 처리에 적합하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`YoutubeChannelSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`YouTube 채널 내에서 검색하기 위한 RAG 도구로, 비디오 콘텐츠 분석에 유용하다.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:_jsx(_components.strong,{children:`YoutubeVideoSearchTool`})}),_jsx(_components.td,{style:{textAlign:`left`},children:`YouTube 비디오 내에서 검색하기 위한 RAG 도구로, 비디오 데이터 추출에 적합하다.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`나만의-도구-만들기`,children:`나만의 도구 만들기`}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`개발자는 에이전트의 필요에 맞게 `,_jsx(_components.code,{children:`커스텀 도구`}),`를 직접 만들거나, 미리 만들어진 옵션을 활용할 수 있다.`]})}),`\n`,_jsx(_components.p,{children:`CrewAI 도구를 만드는 데는 크게 두 가지 방법이 있다:`}),`\n`,_jsxs(Heading,{level:`3`,id:`basetool-서브클래싱`,children:[_jsx(_components.code,{children:`BaseTool`}),` 서브클래싱`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` crewai.tools `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` BaseTool`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` pydantic `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` BaseModel, Field`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` MyToolInput`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`BaseModel`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"\"MyCustomTool의 입력 스키마.\"\"\"`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` argument: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Field(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`...`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`description`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"인자의 설명.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` MyCustomTool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`BaseTool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` name: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"내 도구의 이름\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` description: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"이 도구가 수행하는 작업. 효과적인 활용을 위해 중요하다.\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` args_schema: Type[BaseModel] `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` MyToolInput`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` _run`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`argument`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # 도구의 로직을 여기에 작성`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"도구의 결과\"`})]}),`\n`]})})}),`\n`,_jsxs(Heading,{level:`3`,id:`tool-데코레이터-활용하기`,children:[_jsx(_components.code,{children:`tool`}),` 데코레이터 활용하기`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`6`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` crewai.tools `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` tool`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@tool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"내 도구 이름\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` my_tool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`question`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"\"이 도구가 어떤 용도로 사용되는지 명확히 설명한다. 에이전트가 이를 사용하려면 이 정보가 필요하다.\"\"\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # 함수 로직 작성`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"커스텀 도구의 결과\"`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`구조화된-도구`,children:`구조화된 도구`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`StructuredTool`}),` 클래스는 함수를 도구로 감싸서 유연성과 검증 기능을 제공하며, 보일러플레이트 코드를 줄여준다. 이 클래스는 커스텀 스키마와 동적 로직을 지원하여 복잡한 기능을 원활하게 통합할 수 있게 한다.`]}),`\n`,_jsx(Heading,{level:`4`,id:`예제`,children:`예제:`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`StructuredTool.from_function`}),`을 사용해 외부 API나 시스템과 상호작용하는 함수를 감싸면 구조화된 인터페이스를 제공할 수 있다. 이를 통해 강력한 검증과 일관된 실행이 가능해지며, 복잡한 기능을 애플리케이션에 통합하기가 더 쉬워진다. 다음 예제에서 이를 확인할 수 있다:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`32`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`32`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` crewai.tools.structured_tool `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` CrewStructuredTool`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` pydantic `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` BaseModel`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Pydantic을 사용해 도구의 입력 스키마 정의`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` APICallInput`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`BaseModel`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` endpoint: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` parameters: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`dict`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# API 호출을 실행하는 래퍼 함수`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` tool_wrapper`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`*`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`args`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`kwargs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # 여기서는 일반적으로 매개변수를 사용해 API를 호출`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # 예시를 위해 플레이스홀더 문자열 반환`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` f`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Call the API at `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`kwargs[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'endpoint'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` with parameters `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`kwargs[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'parameters'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 구조화된 도구 생성 및 반환`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` create_structured_tool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`():`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` CrewStructuredTool.from_function(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'Wrapper API'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` description`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"구조화된 입력으로 API 호출을 감싸는 도구.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` args_schema`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`APICallInput,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` func`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`tool_wrapper,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 예시 사용법`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`structured_tool `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` create_structured_tool()`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 구조화된 입력으로 도구 실행`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`result `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` structured_tool._run(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`**`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"endpoint\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://example.com/api\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"parameters\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"key1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"value1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"key2\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"value2\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`})`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`print`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(result) `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# 출력: Call the API at https://example.com/api with parameters {'key1': 'value1', 'key2': 'value2'}`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`커스텀-캐싱-메커니즘`,children:`커스텀 캐싱 메커니즘`}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`도구는 선택적으로 `,_jsx(_components.code,{children:`cache_function`}),`을 구현해 캐싱 동작을 파인튜닝할 수 있다. 이 함수는 특정 조건에 따라 결과를 캐시할 시점을 결정하며, 캐싱 로직에 대한 세밀한 제어를 제공한다.`]})}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`22`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`22`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` crewai.tools `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` tool`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@tool`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` multiplication_tool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`first_number`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`int`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`second_number`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`int`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"\"두 숫자를 곱해야 할 때 유용한 도구이다.\"\"\"`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` first_number `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`*`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` second_number`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` cache_func`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`args`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`result`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # 이 경우, 결과가 2의 배수일 때만 캐시한다`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` cache `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` result `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`%`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 2`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` ==`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` cache`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`multiplication_tool.cache_function `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` cache_func`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`writer1 `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Agent(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` role`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Writer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` goal`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"어린이를 위한 수학 교재를 작성한다.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` backstory`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"글쓰기 전문가이며 아이들을 가르치는 것을 좋아하지만, 수학에 대한 지식은 전무하다.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` tools`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[multiplication_tool],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` allow_delegation`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`False`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` #...`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`결론`,children:`결론`}),`\n`,_jsx(_components.p,{children:`CrewAI 에이전트의 능력을 확장하는 데 도구는 매우 중요하다. 도구를 활용하면 다양한 작업을 수행하고 효과적으로 협업할 수 있다. CrewAI로 솔루션을 구축할 때는 커스텀 도구와 기존 도구를 모두 활용해 에이전트의 능력을 강화하고 AI 생태계를 발전시켜야 한다. 에러 처리, 캐싱 메커니즘, 도구 인자의 유연성을 고려해 에이전트의 성능과 기능을 최적화한다.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"도구","description":"에이전트 협업과 작업 실행을 위해 CrewAI 프레임워크 내 도구를 이해하고 활용하는 방법.","icon":"screwdriver-wrench","href":"/concepts/tools"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"소개","slug":"소개","depth":2,"children":[]},{"title":"도구란 무엇인가?","slug":"도구란-무엇인가","depth":2,"children":[]},{"title":"도구의 주요 특징","slug":"도구의-주요-특징","depth":2,"children":[]},{"title":"CrewAI 도구 사용하기","slug":"crewai-도구-사용하기","depth":2,"children":[]},{"title":"사용 가능한 CrewAI 도구","slug":"사용-가능한-crewai-도구","depth":2,"children":[]},{"title":"나만의 도구 만들기","slug":"나만의-도구-만들기","depth":2,"children":[{"title":"BaseTool 서브클래싱","slug":"basetool-서브클래싱","depth":3,"children":[]},{"title":"tool 데코레이터 활용하기","slug":"tool-데코레이터-활용하기","depth":3,"children":[]},{"title":"구조화된 도구","slug":"구조화된-도구","depth":3,"children":[]},{"title":"예제:","slug":"예제","depth":4,"children":[]},{"title":"커스텀 캐싱 메커니즘","slug":"커스텀-캐싱-메커니즘","depth":3,"children":[]}]},{"title":"결론","slug":"결론","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"burtk","siteName":"CrewAI","title":"도구 - CrewAI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-01-07T06:46:21.031Z","originalFileLocation":"concepts/tools.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"에이전트 협업과 작업 실행을 위해 CrewAI 프레임워크 내 도구를 이해하고 활용하는 방법.\">\u003cmeta data-mint-head name=\"application-name\" content=\"CrewAI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"도구 - CrewAI\">\u003cmeta data-mint-head property=\"og:description\" content=\"에이전트 협업과 작업 실행을 위해 CrewAI 프레임워크 내 도구를 이해하고 활용하는 방법.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"CrewAI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://crewai.burt.pe.kr/concepts/tools\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://burtk.mintlify.app/_mintlify/api/og/v2?division=Core+Concepts\u0026amp;title=%EB%8F%84%EA%B5%AC\u0026amp;description=%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8+%ED%98%91%EC%97%85%EA%B3%BC+%EC%9E%91%EC%97%85+%EC%8B%A4%ED%96%89%EC%9D%84+%EC%9C%84%ED%95%B4+CrewAI+%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC+%EB%82%B4+%EB%8F%84%EA%B5%AC%EB%A5%BC+%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0+%ED%99%9C%EC%9A%A9%ED%95%98%EB%8A%94+%EB%B0%A9%EB%B2%95.\u0026amp;theme=5c009710c6400deb3b026f8d\u0026amp;signature=86c13f418c1684219c664b0cc967d45a51275b07b2d6c8160d2dfcd343ce9ff1\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"도구 - CrewAI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"에이전트 협업과 작업 실행을 위해 CrewAI 프레임워크 내 도구를 이해하고 활용하는 방법.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://burtk.mintlify.app/_mintlify/api/og/v2?division=Core+Concepts\u0026amp;title=%EB%8F%84%EA%B5%AC\u0026amp;description=%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8+%ED%98%91%EC%97%85%EA%B3%BC+%EC%9E%91%EC%97%85+%EC%8B%A4%ED%96%89%EC%9D%84+%EC%9C%84%ED%95%B4+CrewAI+%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC+%EB%82%B4+%EB%8F%84%EA%B5%AC%EB%A5%BC+%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0+%ED%99%9C%EC%9A%A9%ED%95%98%EB%8A%94+%EB%B0%A9%EB%B2%95.\u0026amp;theme=5c009710c6400deb3b026f8d\u0026amp;signature=86c13f418c1684219c664b0cc967d45a51275b07b2d6c8160d2dfcd343ce9ff1\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/burtk/hKdXq3QrSgYI5ALr/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"CrewAI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#EB6658\">\u003clink data-mint-head rel=\"canonical\" href=\"https://crewai.burt.pe.kr/concepts/tools\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concepts/tools.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://crewai.burt.pe.kr/#organization\",\"name\":\"CrewAI\",\"url\":\"https://crewai.burt.pe.kr\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/burtk/rNQc_sgW_NZiUz5g/crew_only_logo.png?fit=max\u0026auto=format\u0026n=rNQc_sgW_NZiUz5g\u0026q=85\u0026s=416de478f9659f33187a270b65cd8692\"}},{\"@type\":\"WebSite\",\"@id\":\"https://crewai.burt.pe.kr#website\",\"name\":\"CrewAI\",\"url\":\"https://crewai.burt.pe.kr\",\"publisher\":{\"@id\":\"https://crewai.burt.pe.kr/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://crewai.burt.pe.kr/concepts/tools#webpage\",\"url\":\"https://crewai.burt.pe.kr/concepts/tools\",\"name\":\"도구\",\"description\":\"에이전트 협업과 작업 실행을 위해 CrewAI 프레임워크 내 도구를 이해하고 활용하는 방법.\",\"dateModified\":\"2026-01-07T06:46:21.031Z\",\"isPartOf\":{\"@id\":\"https://crewai.burt.pe.kr#website\"},\"breadcrumb\":{\"@id\":\"https://crewai.burt.pe.kr/concepts/tools#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://crewai.burt.pe.kr/concepts/tools#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Core Concepts\",\"item\":\"https://crewai.burt.pe.kr/concepts/agents\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"도구\",\"item\":\"https://crewai.burt.pe.kr/concepts/tools\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://crewai.burt.pe.kr/concepts/tools#article\",\"headline\":\"도구\",\"name\":\"도구\",\"description\":\"에이전트 협업과 작업 실행을 위해 CrewAI 프레임워크 내 도구를 이해하고 활용하는 방법.\",\"url\":\"https://crewai.burt.pe.kr/concepts/tools\",\"mainEntityOfPage\":{\"@id\":\"https://crewai.burt.pe.kr/concepts/tools#webpage\"},\"dateModified\":\"2026-01-07T06:46:21.031Z\",\"publisher\":{\"@id\":\"https://crewai.burt.pe.kr/#organization\"},\"isPartOf\":{\"@id\":\"https://crewai.burt.pe.kr#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"CrewAI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"CrewAI","nav":{"global":{"anchors":[{"anchor":"Community","href":"https://community.crewai.com","icon":"discourse"},{"anchor":"Changelog","href":"https://github.com/crewAIInc/crewAI/releases","icon":"timeline"}]},"tabs":[{"tab":"Get Started","groups":[{"group":"Get Started","pages":[{"title":"소개","icon":"handshake","href":"/introduction"},{"title":"설치","icon":"wrench","href":"/installation"},{"title":"Quickstart","icon":"rocket","href":"/quickstart"}]},{"group":"Core Concepts","pages":[{"title":"Agents","icon":"robot","href":"/concepts/agents"},{"title":"Tasks","icon":"list-check","href":"/concepts/tasks"},{"title":"Crews","icon":"people-group","href":"/concepts/crews"},{"title":"Flows","icon":"arrow-progress","href":"/concepts/flows"},{"title":"Knowledge","icon":"book","href":"/concepts/knowledge"},{"title":"LLMs","icon":"microchip-ai","href":"/concepts/llms"},{"title":"Processes","icon":"bars-staggered","href":"/concepts/processes"},{"title":"협업","icon":"screen-users","href":"/concepts/collaboration"},{"title":"Training","icon":"dumbbell","href":"/concepts/training"},{"title":"Memory","icon":"database","href":"/concepts/memory"},{"title":"Planning","icon":"brain","href":"/concepts/planning"},{"title":"테스트","icon":"vial","href":"/concepts/testing"},{"title":"CLI","description":"CrewAI CLI를 사용하여 CrewAI와 상호작용하는 방법을 알아보세요.","icon":"terminal","href":"/concepts/cli"},{"title":"도구","icon":"screwdriver-wrench","href":"/concepts/tools"},{"title":"LangChain 도구 활용하기","description":"CrewAI 에이전트와 LangChain 도구를 통합하여 검색 기반 쿼리 등을 강화하는 방법을 알아보세요.","icon":"link","href":"/concepts/langchain-tools"},{"title":"LlamaIndex 도구 활용하기","icon":"toolbox","href":"/concepts/llamaindex-tools"}]},{"group":"How to Guides","pages":[{"title":"커스텀 도구 만들기","icon":"hammer","href":"/how-to/create-custom-tools"},{"title":"순차적 프로세스","icon":"forward","href":"/how-to/sequential-process"},{"title":"계층적 프로세스","icon":"sitemap","href":"/how-to/hierarchical-process"},{"title":"나만의 매니저 에이전트 만들기","icon":"user-shield","href":"/how-to/custom-manager-agent"},{"title":"다양한 LLM 연결하기","icon":"brain-circuit","href":"/how-to/llm-connections"},{"title":"커스텀 에이전트 설정","icon":"user-pen","href":"/how-to/customizing-agents"},{"title":"멀티모달 에이전트 활용하기","icon":"video","href":"/how-to/multimodal-agents"},{"title":"코딩 에이전트","icon":"rectangle-code","href":"/how-to/coding-agents"},{"title":"도구 출력 결과 강제 지정","icon":"wrench-simple","href":"/how-to/force-tool-output-as-result"},{"title":"실행 과정에서의 인간 입력","icon":"user-check","href":"/how-to/human-input-on-execution"},{"title":"비동기 방식으로 크루 시작하기","icon":"rocket-launch","href":"/how-to/kickoff-async"},{"title":"Kickoff Crew for Each","icon":"at","href":"/how-to/kickoff-for-each"},{"title":null,"href":"/how-to/replay-tasks-from-latest-crew-kickoff"},{"title":"조건부 작업","icon":"diagram-subtask","href":"/how-to/conditional-tasks"},{"title":"AgentOps를 활용한 에이전트 모니터링","icon":"paperclip","href":"/how-to/agentops-observability"},{"title":"Langtrace를 활용한 에이전트 모니터링","icon":"chart-line","href":"/how-to/langtrace-observability"},{"title":"MLflow를 활용한 에이전트 모니터링","icon":"bars-staggered","href":"/how-to/mlflow-observability"},{"title":"OpenLIT로 에이전트 모니터링 시작하기","icon":"magnifying-glass-chart","href":"/how-to/openlit-observability"},{"title":"Portkey를 활용한 에이전트 모니터링","icon":"key","href":"/how-to/portkey-observability"},{"title":"Langfuse로 에이전트 모니터링하기","icon":"magnifying-glass-chart","href":"/how-to/langfuse-observability"}]},{"group":"Tools","pages":[{"title":"Browserbase Web Loader","icon":"browser","href":"/tools/browserbaseloadtool"},{"title":"Code Docs RAG Search","icon":"code","href":"/tools/codedocssearchtool"},{"title":"Code Interpreter","icon":"code-simple","href":"/tools/codeinterpretertool"},{"title":"Composio Tool","icon":"gear-code","href":"/tools/composiotool"},{"title":"CSV RAG 검색","icon":"file-csv","href":"/tools/csvsearchtool"},{"title":"DALL-E Tool","icon":"image","href":"/tools/dalletool"},{"title":"Directory RAG Search","icon":"address-book","href":"/tools/directorysearchtool"},{"title":"디렉토리 읽기","icon":"folder-tree","href":"/tools/directoryreadtool"},{"title":"DOCX RAG 검색","icon":"file-word","href":"/tools/docxsearchtool"},{"title":"EXA Search Web Loader","icon":"globe-pointer","href":"/tools/exasearchtool"},{"title":"파일 읽기","icon":"folders","href":"/tools/filereadtool"},{"title":"파일 쓰기","icon":"file-pen","href":"/tools/filewritetool"},{"title":"Firecrawl 웹사이트 크롤링","icon":"fire-flame","href":"/tools/firecrawlcrawlwebsitetool"},{"title":"Firecrawl 웹사이트 스크랩","icon":"fire-flame","href":"/tools/firecrawlscrapewebsitetool"},{"title":"Firecrawl Search","icon":"fire-flame","href":"/tools/firecrawlsearchtool"},{"title":"Github Search","icon":"github","href":"/tools/githubsearchtool"},{"title":"Google Serper 검색","icon":"google","href":"/tools/serperdevtool"},{"title":"JSON RAG 검색","icon":"file-code","href":"/tools/jsonsearchtool"},{"title":"MDX RAG 검색","icon":"markdown","href":"/tools/mdxsearchtool"},{"title":"MySQL RAG 검색","icon":"database","href":"/tools/mysqltool"},{"title":"NL2SQL Tool","icon":"language","href":"/tools/nl2sqltool"},{"title":"PDF RAG 검색","icon":"file-pdf","href":"/tools/pdfsearchtool"},{"title":"PG RAG 검색","icon":"database","href":"/tools/pgsearchtool"},{"title":"웹사이트 스크래핑","icon":"magnifying-glass-location","href":"/tools/scrapewebsitetool"},{"title":"Selenium Scraper","icon":"clipboard-user","href":"/tools/seleniumscrapingtool"},{"title":"Spider Scraper","icon":"spider-web","href":"/tools/spidertool"},{"title":"TXT RAG 검색","icon":"file-lines","href":"/tools/txtsearchtool"},{"title":"Vision Tool","icon":"eye","href":"/tools/visiontool"},{"title":"웹사이트 RAG 검색","icon":"globe-stand","href":"/tools/websitesearchtool"},{"title":"XML RAG 검색","icon":"file-xml","href":"/tools/xmlsearchtool"},{"title":"YouTube 채널 RAG 검색","icon":"youtube","href":"/tools/youtubechannelsearchtool"},{"title":"YouTube Video RAG Search","icon":"youtube","href":"/tools/youtubevideosearchtool"}]},{"group":"Telemetry","pages":[{"title":"Telemetry","icon":"signal-stream","href":"/telemetry"}]}]},{"tab":"Examples","pages":[{"title":"Examples","href":"/examples/example"}]}]},"basePath":"","title":"도구 - CrewAI","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":[],"chunks":[]}