메인 콘텐츠로 건너뛰기
이 페이지에서는 Weave 외부에서 트레이스 데이터를 분석할 수 있도록 Weave Calls를 쿼리하고 내보내는 방법을 설명합니다. 예를 들어 맞춤형 대시보드를 구축하거나, 공동 작업자와 결과를 공유하거나, 오프라인 분석을 수행할 수 있습니다. Weave UI에서 Calls를 내보내거나, Python 또는 TypeScript SDK를 사용해 프로그래밍 방식으로 가져오거나, Service API를 사용해 직접 쿼리할 수도 있습니다.

Weave UI에서 Calls 내보내기

Weave UI에서는 데이터를 여러 형식으로 내보낼 수 있습니다. 또한 행을 프로그래밍 방식으로 내보낼 때 사용할 수 있는 Python 및 cURL 코드도 표시됩니다. Calls를 내보내려면 다음 단계를 따르세요.
  1. wandb.ai로 이동한 다음 프로젝트를 선택합니다.
  2. Weave 프로젝트 사이드바에서 Traces를 클릭합니다.
  3. 내보내려는 여러 Calls의 행을 체크해 선택합니다.
  4. Traces 테이블 툴바에서 내보내기 또는 다운로드 버튼을 클릭합니다.
  5. Export 모달에서 Selected rows 또는 All rows를 선택합니다.
  6. Export를 클릭합니다.
내보낼 수 있도록 여러 Calls를 선택한 상태가 Export 모달에 표시된 Traces 페이지

프로그래밍 방식으로 call 조회하기

UI 외부에서 Call를 필터링, 정렬 또는 처리하려면 Weave SDK 중 하나 또는 Service API를 사용해 조회하세요. 워크플로에 가장 잘 맞는 인터페이스를 선택하세요.
Python API를 사용해 Call를 조회하려면 client.get_calls 메서드를 사용하세요:
import weave

# 클라이언트 초기화
client = weave.init("your-project-name")

# calls 조회
calls = client.get_calls(filter=...)
call 속성과 필드에 대한 전체 내용은 Call 스키마 레퍼런스를 참조하세요.

Call 메트릭 내보내기

기본 Call 레코드 대신 비용이나 지연 시간 추세와 같은 집계 수준의 인사이트가 필요한 경우, 이 섹션에서 설명하는 메트릭 엔드포인트를 사용하세요. Call 데이터 자체를 조회하지 않고도 Call에 대한 메트릭을 조회하려면 Weave Service API의 POST /calls/stats 엔드포인트를 사용할 수도 있습니다. 지연 시간 및 비용과 같은 Call 정보를 조회하고 이를 합계, 평균, 최소, 최대, 개수 기준으로 집계할 수 있습니다. 예를 들어 다음을 조회할 수 있습니다.
  • 총 토큰 사용량
  • 평균 지연 시간
  • 사용된 최대 토큰 수
  • 총비용
  • 최소 입력 토큰 수
이 엔드포인트는 여러 필터링 옵션을 제공하므로 지정한 시간 내에 생성된 Call과 다음과 같은 다른 속성을 기준으로 대상을 지정할 수 있습니다.
  • Op 이름
  • Trace ID
  • Thread ID
  • User ID
다음 예시는 web_app라는 이름의 Op에서 이틀 동안 생성된 Call을 조회하는 방법을 보여줍니다. [YOUR-TEAM-NAME/YOUR-PROJECT-NAME]을 팀 이름과 프로젝트 이름으로 바꾸세요.
import requests
import json
import os

url = "https://trace.wandb.ai/calls/stats"

payload = {
    "project_id": "[YOUR-TEAM-NAME/YOUR-PROJECT-NAME]",
    "start": "2026-03-01T00:00:00Z",
# 버킷 크기를 초 단위로 지정합니다.
    "granularity": 86400,
    "filter": {
        "trace_roots_only": True,
        "op_names": ["web_app"]
    },
# 메트릭과 해당 집계 함수를 지정합니다.
    "usage_metrics": [
        {"metric": "total_tokens", "aggregations": ["sum"]},
        {"metric": "total_cost", "aggregations": ["sum"]}
    ],
    "call_metrics": [
        {"metric": "call_count", "aggregations": ["sum"]},
        {"metric": "error_count", "aggregations": ["sum"]},
        {"metric": "latency_ms", "aggregations": ["avg", "min", "max"], "percentiles": [50, 95, 99]}
    ]
}

API_KEY = os.getenv("WANDB_API_KEY")

response = requests.post(url, json=payload, auth=("api", API_KEY))

print(json.dumps(response.json(), indent=2))
const url = "https://trace.wandb.ai/calls/stats";

const payload = {
  project_id: "[YOUR-TEAM-NAME/YOUR-PROJECT-NAME]",
  start: "2026-03-01T00:00:00Z",
// 버킷 크기를 초 단위로 지정합니다.
  granularity: 86400,
  filter: {
    trace_roots_only: true,
    op_names: ["web_app"],
  },
// 메트릭과 해당 집계 함수를 지정합니다.
  usage_metrics: [
    { metric: "total_tokens", aggregations: ["sum"] },
    { metric: "total_cost", aggregations: ["sum"] },
  ],
  call_metrics: [
    { metric: "call_count", aggregations: ["sum"] },
    { metric: "error_count", aggregations: ["sum"] },
    { metric: "latency_ms", aggregations: ["avg", "min", "max"], percentiles: [50, 95, 99] },
  ],
};

const API_KEY = process.env.WANDB_API_KEY!;

const response = await fetch(url, {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: "Basic " + btoa(`api:${API_KEY}`),
  },
  body: JSON.stringify(payload),
});

const data = await response.json();
console.log(JSON.stringify(data, null, 2));
이 요청은 메트릭을 어떻게 집계할지도 지정합니다. 메트릭은 sum, count, avg, min, max, count 기준으로 집계할 수 있습니다. 이 엔드포인트는 JSON 객체를 반환합니다. 다음 예시 응답은 이틀 동안의 메트릭을 보여줍니다. 각 날짜(버킷)는 usage_bucketscall_buckets 배열에서 각각 별도의 객체로 표시됩니다. 각 배열은 메트릭을 서로 다른 방식으로 분류합니다.
  • usage_buckets: 사용된 모델을 기준으로 각 날짜의 Call 메트릭을 그룹화합니다.
  • call_buckets: 사용된 모델과 관계없이 각 날짜의 Call 메트릭을 그룹화합니다.
버킷 크기를 변경하려면 요청의 granularity 필드(초 단위)를 설정하세요.
{
  "start": "2026-03-03T00:00:00Z",
  "end": "2026-03-04T21:34:39.746539Z",
  "granularity": 86400,
  "timezone": "UTC",
  "usage_buckets": [
    {
      "timestamp": "2026-03-03T00:00:00",
      "model": "gpt-4o-2024-08-06",
      "sum_total_tokens": 498.0,
      "sum_input_tokens": 219.0,
      "sum_output_tokens": 279.0,
      "count": 5,
      "sum_total_cost": 0.0033374999156876584
    },
    {
      "timestamp": "2026-03-03T00:00:00",
      "model": "gpt-5-2025-08-07",
      "sum_total_tokens": 0.0,
      "sum_input_tokens": 0.0,
      "sum_output_tokens": 0.0,
      "count": 0,
      "sum_total_cost": 0.0
    },
    {
      "timestamp": "2026-03-04T00:00:00",
      "model": "gpt-4o-2024-08-06",
      "sum_total_tokens": 58.0,
      "sum_input_tokens": 27.0,
      "sum_output_tokens": 31.0,
      "count": 1,
      "sum_total_cost": 0.0003774999904635479
    },
    {
      "timestamp": "2026-03-04T00:00:00",
      "model": "gpt-5-2025-08-07",
      "sum_total_tokens": 427.0,
      "sum_input_tokens": 26.0,
      "sum_output_tokens": 401.0,
      "count": 1,
      "sum_total_cost": 0.00404249989787786
    }
  ],
  "call_buckets": [
    {
      "timestamp": "2026-03-03T00:00:00",
      "sum_call_count": 6,
      "sum_error_count": 1,
      "avg_latency_ms": 1505.6666666666667,
      "min_latency_ms": 525,
      "max_latency_ms": 2524,
      "p50_latency_ms": 1534.0,
      "p95_latency_ms": 2328.5,
      "p99_latency_ms": 2484.9000000000005,
      "count": 6
    },
    {
      "timestamp": "2026-03-04T00:00:00",
      "sum_call_count": 2,
      "sum_error_count": 0,
      "avg_latency_ms": 3645.0,
      "min_latency_ms": 1739,
      "max_latency_ms": 5551,
      "p50_latency_ms": 3645.0,
      "p95_latency_ms": 5360.4,
      "p99_latency_ms": 5512.88,
      "count": 2
    }
  ]
}
최대 31일 범위의 메트릭을 쿼리할 수 있습니다. 사용 가능한 옵션에 대한 자세한 내용은 Service API 레퍼런스를 참조하세요.