> ## 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.

# Pi 확장

> Agent Lens에서 Pi 에이전트형 세션, LLM Call, 도구 실행을 트레이스합니다.

[Pi](https://pi.dev/)는 터미널 기반 코딩 에이전트입니다. CoreWeave Agent Lens는 Weights & Biases Weave SDK(`weave`)의 `createOtelExtension` 인테그레이션을 사용하여 Pi 세션, LLM Call, 도구 실행을 자동으로 트레이스합니다. 이 인테그레이션은 [GenAI 시맨틱 규칙](https://opentelemetry.io/docs/specs/semconv/gen-ai/)을 준수합니다. 이 페이지에서는 Pi 애플리케이션에서 Agent Lens 트레이싱을 활성화하는 방법을 설명합니다. 트레이싱을 활성화하면 에이전트 동작을 관찰하고, run을 디버그하고, 토큰 사용량과 비용을 분석할 수 있습니다.

<Note>
  CoreWeave Forge SDK는 아직 Pi 인테그레이션을 지원하지 않으므로 이 페이지에서는 Weave SDK를 사용합니다. 두 제품은 동일한 트레이스 데이터를 공유하므로 Weave로 전송한 트레이스는 Agent Lens에도 표시됩니다.
</Note>

<Warning>
  이 인테그레이션은 Pi 세션 데이터를 Agent Lens로 전송합니다. 여기에는 사용자 프롬프트, 모델 응답, 도구 입력과 출력, Pi 도구가 읽은 파일 내용, 셸 명령어와 출력, 가져온 URL과 페이지 콘텐츠가 포함될 수 있습니다.

  이 인테그레이션은 PII 제거나 민감한 데이터 마스킹 기능을 제공하지 않습니다. 보안 또는 규정 준수 요구 사항으로 인해 이 데이터를 Agent Lens로 전송할 수 없다면 Pi 애플리케이션에서 Agent Lens 트레이싱을 활성화하지 마세요.
</Warning>

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

* [Node.js](https://nodejs.org/) (v22.19 이상). Node 20에서는 `npm`이 Node 20을 여전히 지원하는 이전 버전의 Pi 릴리스를 설치합니다.
* CoreWeave Forge 계정 및 `WANDB_API_KEY` 환경 변수로 설정한 [API 키](https://forge.coreweave.com/settings#apikeys).

<Note>
  Pi는 TypeScript 및 Node.js 프레임워크이며, 이에 대응하는 Python 프레임워크는 없습니다. Pi를 사용하려면 ESM 모듈 시스템이 필요합니다. 프로젝트의 `package.json`에 `"type": "module"`을 지정하거나, TypeScript를 ESM 출력으로 컴파일해야 합니다. CommonJS 프로젝트에서는 오류가 발생합니다. ESM 프로젝트 설정에 대한 자세한 내용은 [TypeScript SDK 인테그레이션](/ko/products/wandb/weave/guides/integrations/js#set-up-an-esm-project)을 참조하세요.
</Note>

<h2 id="install-packages">
  패키지 설치
</h2>

Agent Lens, Pi, Node 타입 정의를 로컬 프로젝트 의존성으로 설치하세요:

```bash lines theme={"system"}
npm install weave @earendil-works/pi-coding-agent
npm install --save-dev @types/node tsx typescript
```

<h2 id="trace-a-pi-prompt-and-response">
  Pi 프롬프트와 응답 트레이스하기
</h2>

다음 예시는 단일 Pi 프롬프트와 응답을 트레이스하는 데 필요한 최소 설정을 보여줍니다. 에이전트 세션을 생성하기 전에 `weave` 패키지의 `init()`을 호출한 다음, `createOtelExtension()`을 확장 팩토리로 전달하세요. Agent Lens는 대화, 각 프롬프트-응답 사이클(`invoke_agent`), 개별 LLM Call(`chat`), 도구 실행(`execute_tool`)을 포함한 에이전트의 전체 라이프사이클을 트레이스합니다. 세션 ID는 `SessionManager.inMemory()`가 자동으로 생성합니다.

```typescript lines twoslash theme={"system"}
// @noErrors
import {init, createOtelExtension} from 'weave';

import {
  createAgentSession,
  DefaultResourceLoader,
  SessionManager,
  getAgentDir,
} from '@earendil-works/pi-coding-agent';

async function main() {
  // 1. Weave를 초기화합니다. Weave 프로젝트를 가리키는 OTEL TracerProvider를
  //    설정합니다. createOtelExtension()이 생성하는 모든 span은
  //    이곳으로 자동으로 내보내집니다.
  await init('[YOUR-TEAM]/[YOUR-PROJECT]');

  // 2. 리소스 로더를 생성하고 Weave OTEL 확장을 주입합니다.
  //    리소스 로더는 에이전트 활동을 트레이싱하는 데 사용되는 Pi 런타임 환경과
  //    확장 라이프사이클을 제공합니다.
  const resourceLoader = new DefaultResourceLoader({
    cwd: process.cwd(),
    agentDir: getAgentDir(),
    extensionFactories: [createOtelExtension({})],
  });

  await resourceLoader.reload();

  // 3. 에이전트 세션을 시작합니다
  const {session} = await createAgentSession({
    resourceLoader,
    sessionManager: SessionManager.inMemory(),
  });

  // 4. 확장을 바인딩합니다. session_start 이벤트가 트리거되어 OTEL 어댑터가
  //    루트 대화 span을 생성하고 대화 ID를 캡처합니다.
  await session.bindExtensions({});

  // 5. assistant 출력을 stdout으로 스트리밍합니다
  session.subscribe(event => {
    if (
      event.type === 'message_update' &&
      event.assistantMessageEvent.type === 'text_delta'
    ) {
      process.stdout.write(event.assistantMessageEvent.delta);
    }
  });

  // 6. 프롬프트를 전송하고 전체 응답을 기다립니다
  await session.prompt('What files are in the current directory?');
  console.log();
}

main();
```

`[FILENAME]`을 사용 중인 TypeScript 파일 이름으로 바꾼 후, `tsx`로 스크립트를 컴파일하고 실행하세요.

```bash theme={"system"}
npx tsx [FILENAME].ts
```

코드를 실행하면 `https://forge.coreweave.com/agent-lens/[YOUR-TEAM]/[YOUR-PROJECT]` 에 있는 Agent Lens 프로젝트의 **Conversations** 탭에 트레이스가 표시됩니다. Agent Lens는 애플리케이션을 실행할 때마다 Pi 세션, LLM Call, 도구 실행을 캡처합니다.

<h3 id="next-steps">
  다음 단계
</h3>

이 예제를 멀티턴 대화로 확장하려면 프롬프트를 더 추가하세요. Agent Lens는 `session.prompt()`를 호출할 때마다 이를 별도의 `invoke_agent` span으로 트레이스하며, 이 span은 모두 하나의 루트 span 아래에 중첩됩니다. 에이전트는 여러 프롬프트에 걸쳐 컨텍스트를 자동으로 유지합니다.

코드를 실행하면 **Conversations** 탭에 중첩된 LLM Call, 도구 실행, 토큰 사용량, 비용이 포함된 전체 멀티턴 타임라인이 표시됩니다.
