> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Agno

> OpenTelemetry를 사용해 Weave로 Agno 멀티 에이전트 시스템을 트레이스하고, 에이전트 상호작용, 도구 Call, 멀티모달 워크플로를 캡처하세요.

[OpenTelemetry (OTEL)](https://opentelemetry.io/)를 사용하면 Weave에서 [Agno](https://docs.agno.com/) 에이전트 및 도구 Call을 트레이스할 수 있습니다. Agno는 공유 메모리, 지식, 추론 기능을 갖춘 멀티 에이전트 시스템을 구축하기 위한 Python 프레임워크입니다. 가볍고 특정 모델에 종속되지 않도록 설계되었으며, 텍스트, 이미지, 오디오, 비디오 처리 등 멀티모달 기능을 지원합니다.

이 가이드에서는 OTEL을 사용해 Agno 에이전트 및 도구 Call을 트레이스하고 해당 트레이스를 Weave에서 시각화하는 방법을 설명합니다. 필요한 의존성을 설치하고, Weave로 데이터를 전송하도록 OTEL 트레이서를 설정한 다음, Agno 에이전트와 도구를 계측하는 방법을 알아봅니다.

<Tip>
  Weave의 OTEL 트레이싱에 대한 자세한 내용은 [Send OTEL Traces to Weave](/ko/products/wandb/weave/guides/tracking/otel)를 참조하세요.
</Tip>

<h2 id="prerequisites">
  사전 요구 사항
</h2>

1. 필요한 의존성을 설치하세요:

   ```bash theme={"system"}
   pip install agno openinference-instrumentation-agno opentelemetry-sdk opentelemetry-exporter-otlp-proto-http
   ```

2. OpenAI API 키(또는 다른 모델 공급자의 API 키)를 환경 변수로 설정하세요:

   ```bash theme={"system"}
   export OPENAI_API_KEY=your_api_key_here
   ```

3. [Weave에서 OTEL 트레이싱을 설정](#configure-otel-tracing-in-weave)하세요.

<h3 id="configure-otel-tracing-in-weave">
  Weave에서 OTEL 트레이싱 설정
</h3>

Agno에서 Weave로 트레이스를 전송하려면 `TracerProvider`와 `OTLPSpanExporter`를 사용해 OTEL을 설정하세요. 익스포터에는 [인증 및 프로젝트 식별에 필요한 올바른 엔드포인트와 HTTP 헤더](#required-configuration)를 지정하세요.

<Note>
  API 키, 프로젝트 정보 같은 민감한 환경 변수는 환경 파일(예: `.env`)에 저장하고 `os.environ`으로 불러오세요. 이렇게 하면 자격 증명을 코드베이스와 분리해 안전하게 보관할 수 있습니다.
</Note>

<h4 id="required-configuration">
  필수 설정
</h4>

다음 엔드포인트와 헤더를 사용해 OTLP 익스포터를 설정하세요.

* **엔드포인트:** `https://trace.wandb.ai/otel/v1/traces`
* **헤더:**
  * `Authorization`: W\&B API 키를 사용한 Basic 인증입니다.
  * `project_id`: W\&B entity/프로젝트 이름입니다(예: `myteam/myproject`).

<h2 id="send-otel-traces-from-agno-to-weave">
  Agno에서 Weave로 OTEL 트레이스 보내기
</h2>

[사전 요구 사항](#prerequisites)을 완료하면 Agno에서 Weave로 OTEL 트레이스를 보낼 수 있습니다. 다음 코드 스니펫은 OTLP span 익스포터와 트레이서 프로바이더를 설정하여 Agno 애플리케이션에서 Weave로 OTEL 트레이스를 보내는 방법을 보여줍니다.

<Warning>
  Weave에서 Agno를 올바르게 트레이스하려면 코드에서 Agno 컴포넌트를 사용하기 *전에* 전역 트레이서 프로바이더를 설정하세요.
</Warning>

```python lines theme={"system"}
# tracing.py

import base64
import os
from openinference.instrumentation.agno import AgnoInstrumentor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk import trace as trace_sdk
from opentelemetry.sdk.trace.export import SimpleSpanProcessor
from opentelemetry import trace

# 환경 변수에서 민감한 값을 불러옵니다
WANDB_BASE_URL = "https://trace.wandb.ai"
# W&B entity/프로젝트 이름 (예: "myteam/myproject")
PROJECT_ID = os.environ.get("WANDB_PROJECT_ID")
# https://forge.coreweave.com/settings 에서 W&B API 키를 생성하세요
WANDB_API_KEY = os.environ.get("WANDB_API_KEY")

WEAVE_OTLP_ENDPOINT = f"{WANDB_BASE_URL}/otel/v1/traces"
AUTH = base64.b64encode(f"api:{WANDB_API_KEY}".encode()).decode()

OTEL_EXPORTER_OTLP_HEADERS = {
    "Authorization": f"Basic {AUTH}",
    "project_id": PROJECT_ID,
}

# 엔드포인트와 헤더를 지정해 OTLP span 익스포터를 생성합니다
exporter = OTLPSpanExporter(
    endpoint=WEAVE_OTLP_ENDPOINT,
    headers=OTEL_EXPORTER_OTLP_HEADERS,
)

# 트레이서 프로바이더를 생성하고 익스포터를 추가합니다
tracer_provider = trace_sdk.TracerProvider()
tracer_provider.add_span_processor(SimpleSpanProcessor(exporter))

# Agno를 임포트하거나 사용하기 *전에* 전역 트레이서 프로바이더를 설정합니다
trace.set_tracer_provider(tracer_provider)
```

<h2 id="trace-agno-agents-with-otel">
  OTEL로 Agno 에이전트 트레이스하기
</h2>

트레이서 프로바이더를 설정하고 나면 자동 트레이싱이 적용된 Agno 에이전트를 생성하고 실행할 수 있습니다. 이후의 모든 에이전트 활동을 Weave가 캡처하도록 하려면 에이전트를 생성하기 전에 Agno를 계측하세요. 다음 예시는 도구를 사용하는 에이전트를 생성하는 방법을 보여 줍니다.

```python lines theme={"system"}
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.yfinance import YFinanceTools

from dotenv import load_dotenv
load_dotenv()

# 위에서 만든 파일에서 AgnoInstrumentor 로드
from tracing import AgnoInstrumentor

# Agno 계측 시작
AgnoInstrumentor().instrument()

# 금융 에이전트 생성
finance_agent = Agent(
    name="Finance Agent",
    model=OpenAIChat(id="gpt-4o-mini"),
    tools=[
        YFinanceTools(
            stock_price=True,
            analyst_recommendations=True,
            company_info=True,
            company_news=True
        )
    ],
    instructions=["Use tables to display data"],
    show_tool_calls=True,
    markdown=True,
)

# 에이전트 사용 - 이 Call은 Weave가 자동으로 트레이스합니다
finance_agent.print_response(
    "What is the current stock price of Apple and what are the latest analyst recommendations?",
    stream=True
)
```

Weave는 모든 에이전트 오퍼레이션을 자동으로 트레이스하므로 실행 흐름, 모델 Call, 추론 단계, 도구 호출을 시각화할 수 있습니다.

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/agno_agent_trace.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=81d92d088338e21c71024a234106af37" alt="Agno 에이전트의 트레이스 시각화" width="2908" height="1582" data-path="products/wandb/weave/_media/agno_agent_trace.png" />
</Frame>

<h2 id="trace-agno-tools-with-otel">
  OTEL로 Agno 도구 트레이스하기
</h2>

Agno에서 도구를 정의하고 사용하면 이러한 도구 Call도 트레이스에 함께 캡처됩니다. OTEL 인테그레이션은 에이전트의 추론 과정과 개별 도구 실행을 모두 자동으로 계측하므로, 에이전트의 동작을 한눈에 파악할 수 있는 종합적인 뷰를 제공합니다.

다음은 여러 도구를 사용하는 예시입니다.

```python lines theme={"system"}
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.duckduckgo import DuckDuckGoTools
from agno.tools.yfinance import YFinanceTools

from dotenv import load_dotenv
load_dotenv()

# 앞에서 만든 파일에서 AgnoInstrumentor 로드
from tracing import AgnoInstrumentor

# Agno 계측 시작
AgnoInstrumentor().instrument()

# 여러 도구를 사용하는 에이전트 생성
research_agent = Agent(
    name="Research Agent",
    model=OpenAIChat(id="gpt-4o-mini"),
    tools=[
        DuckDuckGoTools(),
        YFinanceTools(stock_price=True, company_info=True),
    ],
    instructions=[
        "Search for current information and financial data",
        "Always include sources",
        "Use tables to display financial data"
    ],
    show_tool_calls=True,
    markdown=True,
)

# 에이전트 실행 - Weave가 도구 Call을 트레이스함
research_agent.print_response(
    "Research Tesla's recent performance and news. Include stock price and any recent developments.",
    stream=True
)
```

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/agno_tool_calls.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=2a1b232500d5da96a24bafb7f3ce3fbc" alt="Agno 도구 Call의 트레이스 시각화" width="2908" height="1582" data-path="products/wandb/weave/_media/agno_tool_calls.png" />
</Frame>

<h2 id="trace-multi-agent-teams-with-otel">
  OTEL로 멀티 에이전트 팀 트레이스하기
</h2>

Agno의 멀티 에이전트 아키텍처를 사용하면 서로 협업하고 컨텍스트를 공유하는 에이전트 팀을 만들 수 있습니다. Weave는 이러한 팀 상호작용도 전체 과정을 트레이스합니다.

```python lines theme={"system"}
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.duckduckgo import DuckDuckGoTools
from agno.tools.yfinance import YFinanceTools

from dotenv import load_dotenv
load_dotenv()

# tracing.py 파일에서 AgnoInstrumentor 로드
from tracing import AgnoInstrumentor

# Agno 계측 시작
AgnoInstrumentor().instrument()

# 역할별 전문 에이전트 생성
web_agent = Agent(
    name="Web Agent",
    role="Search the web for information",
    model=OpenAIChat(id="gpt-4o-mini"),
    tools=[DuckDuckGoTools()],
    instructions="Always include sources",
    show_tool_calls=True,
    markdown=True,
)

finance_agent = Agent(
    name="Finance Agent",
    role="Get financial data",
    model=OpenAIChat(id="gpt-4o-mini"),
    tools=[YFinanceTools(stock_price=True, analyst_recommendations=True)],
    instructions="Use tables to display data",
    show_tool_calls=True,
    markdown=True,
)

# 에이전트 팀 생성
agent_team = Agent(
    team=[web_agent, finance_agent],
    model=OpenAIChat(id="gpt-4o"),
    instructions=["Always include sources", "Use tables to display data"],
    show_tool_calls=True,
    markdown=True,
)

# 팀 실행 - Weave가 모든 에이전트 간 상호작용을 트레이스합니다
agent_team.print_response(
    "What's the current market sentiment around NVIDIA? Include both news analysis and financial metrics.",
    stream=True
)
```

이 멀티 에이전트 트레이스는 Weave에서 여러 에이전트가 어떻게 협업하는지 보여 주므로, 에이전트 팀 전체에서 작업이 어떻게 분배되고 실행되는지 한눈에 파악할 수 있습니다.

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/agno_team_trace.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=322ada104235c30177d518bad18f65c3" alt="Agno 멀티 에이전트 팀의 트레이스 시각화" width="2908" height="1582" data-path="products/wandb/weave/_media/agno_team_trace.png" />
</Frame>

<h2 id="work-with-reasoning-agents">
  추론 에이전트 사용하기
</h2>

Agno는 에이전트가 문제를 단계별로 처리하도록 돕는 추론 기능을 기본 제공하며, 트레이스에는 이러한 추론 과정도 캡처됩니다:

```python lines theme={"system"}
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.reasoning import ReasoningTools
from agno.tools.yfinance import YFinanceTools

from dotenv import load_dotenv
load_dotenv()

# tracing.py 파일에서 AgnoInstrumentor 로드
from tracing import AgnoInstrumentor

# Agno 계측 시작
AgnoInstrumentor().instrument()

# 추론 에이전트 생성
reasoning_agent = Agent(
    name="Reasoning Finance Agent",
    model=OpenAIChat(id="gpt-4o"),
    tools=[
        ReasoningTools(add_instructions=True),
        YFinanceTools(
            stock_price=True,
            analyst_recommendations=True,
            company_info=True,
            company_news=True
        ),
    ],
    instructions="Use tables to display data and show your reasoning process",
    show_tool_calls=True,
    markdown=True,
)

# 추론 에이전트 실행
reasoning_agent.print_response(
    "Should I invest in Apple stock right now? Analyze the current situation and provide a reasoned recommendation.",
    stream=True
)
```

트레이스에는 에이전트가 복잡한 문제를 어떻게 분해하고 의사 결정을 내리는지 보여 주는 추론 단계가 표시됩니다.

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/agno_reasoning_trace.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=66b624b1e556b992a91d16090c23d492" alt="Agno 추론 에이전트의 트레이스 시각화" width="2908" height="1582" data-path="products/wandb/weave/_media/agno_reasoning_trace.png" />
</Frame>

<h2 id="work-with-memory-and-knowledge">
  메모리 및 지식 활용
</h2>

Agno 에이전트는 메모리를 유지하고 지식 베이스에 액세스할 수 있으므로 여러 상호작용에 걸쳐 컨텍스트를 유지할 수 있습니다. Weave는 이러한 오퍼레이션도 트레이스합니다.

```python lines theme={"system"}
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.memory import AgentMemory
from agno.storage.sqlite import SqliteStorage

from dotenv import load_dotenv
load_dotenv()

# tracing.py 파일에서 AgnoInstrumentor 로드
from tracing import AgnoInstrumentor

# Agno 계측 시작
AgnoInstrumentor().instrument()


# 메모리 기능을 갖춘 에이전트 생성
memory_agent = Agent(
    name="Memory Agent",
    model=OpenAIChat(id="gpt-4o-mini"),
    memory=AgentMemory(),
    storage=SqliteStorage(
        table_name="agent_sessions",
        db_file="agent_memory.db"
    ),
    instructions="Remember our conversation history",
    show_tool_calls=True,
    markdown=True,
)

# 첫 번째 상호작용
memory_agent.print_response("My name is John and I'm interested in AI investing strategies.")

# 두 번째 상호작용 - 에이전트가 이전 컨텍스트를 기억함
memory_agent.print_response("What specific AI companies would you recommend for my portfolio?")
```

<Frame>
  <img src="https://mintcdn.com/coreweave-dbfa0e8d/3Dv_sw2eg8feUJlx/products/wandb/weave/_media/agno_memory_use.png?fit=max&auto=format&n=3Dv_sw2eg8feUJlx&q=85&s=1c0479d9d446b6ebaa2c07e734bace39" alt="Agno 메모리 사용량의 트레이스 시각화" width="2908" height="1582" data-path="products/wandb/weave/_media/agno_memory_use.png" />
</Frame>

대화 이력 저장 및 조회 등의 메모리 오퍼레이션이 트레이스에 표시됩니다.

<h2 id="learn-more">
  자세히 알아보기
</h2>

* [Agno 공식 문서](https://docs.agno.com/)
* [OTEL 공식 문서](https://opentelemetry.io/)
* [Agno GitHub 저장소](https://github.com/agno-agi/agno)
* [OpenInference Agno 계측](https://pypi.org/project/openinference-instrumentation-agno/)


## Related topics

- [인테그레이션 개요](/ko/products/wandb/weave/guides/integrations.md)
