문서

문서

Pi

Pi는 Inflection 챗봇이나 코인이 아니라 Earendil의 터미널 코딩 에이전트입니다. models.json에서 baseUrl, api, key, 사용할 모델 ID를 하나의 블록으로 설정해 사용자 지정 제공업체를 지정합니다. 네 필드를 입력하면 키 하나로 Claude와 GPT를 사용할 수 있습니다.

~/.pi/agent/models.json의 사용자 지정 제공자 블록 — baseUrl, api, 모델 ID — 하나의 키로 Earendil의 Pi 터미널 코딩 에이전트를 Claude와 GPT에 연결합니다

~/.pi/agent/models.json
{
  "providers": {
    "kunavo": {
      "baseUrl": "https://api.kunavo.com/v1",
      "api": "openai-completions",
      "apiKey": "$KUNAVO_API_KEY",
      "models": [
        {
          "id": "claude-sonnet-5",
          "name": "Claude Sonnet 5",
          "reasoning": true,
          "input": ["text", "image"],
          "contextWindow": 1000000,
          "maxTokens": 128000
        },
        {
          "id": "claude-haiku-4-5",
          "name": "Claude Haiku 4.5",
          "input": ["text", "image"],
          "contextWindow": 200000,
          "maxTokens": 64000
        }
      ]
    }
  }
}
/v1 접미사를 openai-completions 제공업체에 추가하세요. Pi의 모델 페이지에 있는 호환 엔드포인트 예시에는 이 값과 http://localhost:11434/v1가 함께 표시되어 있으며, 9월 22일 문서를 개정하기 전에는 OpenRouter, Vercel AI Gateway, llama.cpp 예시에도 같은 버전 경로가 있었습니다. 규칙을 직접 설명하는 문장은 없으므로 예시를 통해 확인할 수 있습니다. 접미사가 없는 Base URL은 인증 오류가 아니라 404로 나타납니다.
사용자 지정 모델의 cost 기본값은 모두 0입니다— 이 기본값은 Pi 소스 코드(v0.99.2)에 있으며, 문서에는 더 이상 명시되어 있지 않습니다. 따라서 방금 추가한 제공업체는 직접 요금을 입력하기 전까지 바닥글과 /session에 $0로 표시됩니다. 그 아래의 두 가지 기본값도 더 큰 문제를 일으킵니다. contextWindow는 128000로, maxTokens는 16384로 대체되므로, 비워 둔 모델은 실제로 처리할 수 있는 양보다 훨씬 적은 내용으로 압축 및 잘림 처리됩니다. 위 블록에서는 두 값을 카탈로그 기준으로 설정합니다. 아래 표에서 추가하는 ID에도 똑같이 설정하세요.
Pi가 키를 찾는 우선순위. Pi의 모델 페이지에 따르면 여러 출처가 설정되어 있을 때 “런타임 --api-key을 먼저 사용하고, 저장된 auth.json 인증 정보, models.json의 apiKey, 마지막으로 제공업체의 환경 변수 순으로 사용합니다.” 따라서 /login를 통해 저장한 오래된 키가 파일에 입력한 키보다 우선합니다. 편집한 지 얼마 안 된 블록으로도 다른 자격 증명이 인증에 사용되는 흔한 이유입니다. 같은 페이지에 따르면 사용자 지정 모델은 “models.json에서 불러올 수 있지만, Pi가 자격 증명을 확인할 때까지 /model에서 사용할 수 없습니다.” 선택기에 모델이 나타나지 않는다면 구문 문제가 아니라 자격 증명 문제입니다.
이 블록은 아래 날짜에 Pi의 공식 문서를 확인해 작성했으며, 해당 문서가 9월 22일에 더 이상 설명하지 않게 된 내용, 즉 필드 이름, 사용자 지정 모델의 기본값, api 값은 같은 날 v0.99.2의 Pi 소스 코드를 확인했습니다. Kunavo는 Pi를 자체 엔드포인트에 연결해 실행하지 않았습니다. 세션, 스트리밍 턴, 도구 왕복 호출, 요청이 실제로 어떤 모델로 전달됐는지 확인하는 테스트를 수행하지 않았습니다. 게시된 설정 페이지는 구성 참고 자료이지 호환성 테스트가 아니며, 이 페이지의 내용을 호환성 테스트로 받아들여서는 안 됩니다. 아래의 curl는 10초면 확인할 수 있는 부분입니다. 클라이언트 동작은 Pi와 직접 확인해야 합니다.
아직 키가 없나요? Kunavo 계정을 만들고, 키를 생성한 다음(키는 sk-kn-로 시작합니다) $10부터 크레딧을 추가하세요. 호출 비용은 해당 잔액에서 차감되며 실패한 호출에는 요금이 부과되지 않습니다. 그러면 대시보드가 Pi 설정 화면에서 열립니다.

단계별 안내

  1. /app/keys에서 키를 생성해 복사하세요. 키는 한 번만 표시됩니다.
  2. 환경 변수로 KUNAVO_API_KEY를 설정합니다. Pi는 apiKey 필드에서 "$NAME" 또는 "${NAME}"를 해석하며, 리터럴 값이나 앞에 !command가 붙은 값도 사용할 수 있습니다. 변수 이름 뒤에 리터럴 텍스트가 이어지면 중괄호 형식을 사용합니다.
  3. ~/.pi/agent/models.json를 만들거나 편집하고 위 블록을 붙여 넣습니다. 기본 제공되지 않는 공급자에는 baseUrl와 api 값이 필요하며, 공급자 또는 모델 수준에서 설정할 수 있습니다. Pi 소스 코드는 이 값이 없으면 모델을 불러오지 않습니다. 나머지 항목은 모두 선택 사항입니다. /model를 열면 파일을 다시 불러옵니다.
  4. pi를 시작하고 /model를 실행한 다음 선언한 ID 중 하나를 선택합니다. 목록에 표시되지 않으면 JSON 앞의 키를 확인하세요. 위의 확인 순서 설명을 참고하세요.
  5. 실제 파일을 읽고 수정하는 작업을 맡겨 보세요. Pi는 거의 모든 작업에서 도구 호출에 의존하므로, 파일 시스템을 다루는 첫 실행이 단순한 인사보다 훨씬 많은 정보를 알려 줍니다. 이 실행에서 스트리밍 또는 도구 스키마 불일치도 드러날 수 있습니다. 바로 이런 유형의 문제를 Kunavo가 대신 테스트하지 않았습니다.

Pi의 모델 선택 문서에서 확인했습니다(2026년 10월 1일 기준). 서드파티 설정은 변경될 수 있으므로, 여기의 필드 이름이 실제 화면과 다르면 이 문서가 아니라 해당 페이지를 기준으로 삼으세요.

이것이 요약본입니다. 전체 안내—모델 선택, 실제 세션 비용, 실패 유형—는 Pi를 실제로 실행할 때의 비용, 경로별에 있습니다.

클라이언트를 디버깅하기 전에 확인할 사항

한 번의 요청으로 문제가 엔드포인트, 키 또는 구성 파일 중 어디에 있는지 판단할 수 있습니다. 이 요청에서 JSON이 반환되면 동일한 base URL과 키가 Pi에서 작동합니다.

# Settles whether a failure is the endpoint, the key, or the client.
curl -sS https://api.kunavo.com/v1/models \
  -H "Authorization: Bearer sk-kn-..."

필드에 입력할 model id

모든 텍스트 모델은 model id로 접근할 수 있습니다. 현재 목록은 GET /v1/models이며, 가격이 포함된 카탈로그는 모델 페이지에서 확인할 수 있습니다. 요금은 토큰 100만 개당 USD 기준이며 입력 / 출력 순서입니다.

모델 IDKunavo 입력/출력Pi에서의 위치
claude-sonnet-5$1.40 / $7.00파일을 편집하는 세션에 적합한 기본 작업 모델
claude-opus-5$3.50 / $17.50잘못된 계획의 대가가 큰 변경을 계획할 때
claude-haiku-4-5$0.70 / $3.50분류, 요약, 종일 실행되는 반복 작업에 적합한 저렴한 모델
gpt-5-6-sol$2.00 / $12.00같은 키와 같은 baseUrl을 사용하는 다른 계열의 2차 의견
월정액 없이 선불 잔액에서 토큰별로 청구됩니다. billing을 참고하세요. 반복되는 컨텍스트(에디터나 채팅 클라이언트가 보내는 데이터의 대부분)에서는 모델 선택보다 프롬프트 캐싱이 청구액에 더 큰 영향을 줍니다.

다른 경로: anthropic-messages

2026년 9월 22일 문서가 갱신되기 전까지 Pi는 사용자 지정 공급자의 api에 대해 openai-completions, openai-responses, anthropic-messages, google-generative-ai의 네 가지 값을 문서화했습니다. 갱신된 모델 페이지에는 이 값들이 하나도 나와 있지 않습니다. 한 예시에서 openai-completions를 보여 주고, 해당 사례를 “OpenAI, Anthropic 또는 Google 호환 엔드포인트”라고 설명합니다. v0.99.2의 Pi 소스 코드에서 이 필드는 자유 형식 문자열로 선언되어 있으며, 값에 따라 기본 제공 구현 열 가지 중 하나로 요청을 전달합니다. 앞서 언급한 네 가지와 openai-codex-responses, azure-openai-responses, google-vertex, mistral-conversations, bedrock-converse-stream, pi-messages입니다. 사용자 지정 공급자용으로 문서화된 것은 네 가지뿐이며, 나머지 여섯 가지는 여기서 테스트하지 않았습니다. 이 페이지 어디에도 나머지 값이 타사 엔드포인트에서 작동한다고 명시되어 있지 않습니다.

anthropic-messages는 문서화된 네 가지 중 하나이며, Kunavo는 OpenAI 호환 API뿐 아니라 Anthropic Messages API도 지원합니다. 따라서 이 경로를 설정할 수는 있습니다. 다만 이 페이지에서는 그대로 붙여 넣을 수 있는 블록에 base URL을 기입하지 않습니다. Pi 문서는 이 api의 필드 값을 한 번도 확정하지 않았기 때문입니다. 9월 22일 이전 문서에는 두 가지 방식이 나왔습니다. 한 예시에는 https://proxy.example.com/v1가, 다른 예시에는 단독으로 https://proxy.example.com가 표시됐습니다. 그날 문서가 갱신되면서 둘 중 하나를 선택하는 대신 두 예시가 모두 삭제됐습니다. 이 경로를 선택했다면 한 가지 방식을 시도해 보세요. 첫 호출에서 401 대신 404가 반환되면 해당 줄을 바꾸면 됩니다.

이 api에 관한 Pi의 compat 스키마에는 미리 알아둘 만한 필드가 세 가지 있습니다(소스 코드 v0.99.2). 먼저 이 세 필드 모두에 적용되는 문서의 규칙을 인용할 필요가 있습니다. 호환성 설정은 “엔드포인트의 요청 또는 응답 동작에서 확인된 차이를 설명해야 합니다. 엔드포인트가 OpenAI 또는 Anthropic 호환성을 광고한다는 이유만으로 이 설정을 활성화하지 마세요.”

  1. compat.supportsEagerToolInputStreaming — 도구별 입력을 미리 스트리밍하는 방식을 거부하는 백엔드용입니다.
  2. compat.supportsStrictTools — 엔드포인트가 엄격한 JSON 스키마 도구 정의를 허용하는지 나타냅니다. 사용자 지정 모델은 기본 제공 Anthropic 모델에 선언된 설정을 상속하지 않습니다.
  3. compat.supportsMidConvoEffort — 대화 도중 추론 강도를 변경합니다. 이 엔드포인트가 해당하는지는 런타임에서 확인해야 하며, Kunavo는 실행 테스트를 통해 확인하지 않았습니다.

페이지 맨 위의 openai-completions 블록은 이 세 가지 설정을 모두 사용하지 않습니다. 성능이 더 좋다는 뜻이 아니라, 여기서 시작하는 것이 정직한 이유입니다.

자주 묻는 질문

Pi 코딩 에이전트가 사용자 지정 API 공급자를 사용하도록 설정하려면 어떻게 하나요?

~/.pi/agent/models.json에 공급자 블록을 추가합니다. Pi의 모델 페이지에서는 “엔드포인트가 Pi에서 이미 지원하는 API를 제공하는 경우” models.json을 사용하라고 안내하며, 스키마(소스 코드 v0.99.2)에는 공급자 수준에서 baseUrl, apiKey, api, headers, authHeader, models, modelOverrides를 설정할 수 있습니다. 기본 제공되지 않는 공급자에는 baseUrl이 필요하며, api 값은 공급자 또는 모델 수준에 지정해야 합니다. 스키마에서 api는 목록이 아닌 자유 형식 문자열로 정의됩니다. 2026년 9월 22일 문서가 갱신되기 전까지 Pi는 사용자 지정 공급자용으로 openai-completions, openai-responses, anthropic-messages, google-generative-ai의 네 가지 값을 문서화했습니다. v0.99.2의 소스 코드는 이 필드에 따라 기본 제공 구현 열 가지 중 하나로 요청을 전달합니다. 나머지 여섯 가지는 이 용도로 문서화된 적이 없으며 여기서도 테스트하지 않았습니다. OpenAI 호환 엔드포인트에는 갱신된 문서에도 표시된 openai-completions 값을 사용합니다. models의 각 항목에는 최소한 id가 있어야 하며, 이 값은 엔드포인트에 그대로 전달됩니다. 따라서 같은 구성 형식으로 게이트웨이, 로컬 Ollama 또는 vLLM 서버, 그 밖의 호환 호스트를 설정할 수 있습니다.

Pi 코딩 에이전트는 API 키를 어디서 가져오나요?

네 곳에서 가져오며, Pi의 모델 페이지에는 우선순위가 공개되어 있습니다. 먼저 런타임의 --api-key, 다음은 저장된 auth.json 인증 정보, 그다음은 models.json의 apiKey, 마지막은 공급자의 환경 변수입니다. 따라서 /login으로 앞서 저장한 키가 models.json에 방금 입력한 키보다 우선합니다. apiKey 필드에는 환경 변수 보간("$NAME" 또는 "${NAME}"), 리터럴 값, 또는 앞에 "!"가 붙은 셸 명령의 출력값을 사용할 수 있으므로 비밀 키를 파일에 둘 필요가 없습니다. 사용할 수 있는 인증 정보가 없으면 문서상 사용자 지정 모델은 models.json에서 불러오지만 /model에서는 사용할 수 없습니다.

Pi의 baseUrl은 끝에 /v1을 붙여야 하나요?

openai-completions 공급자라면 그렇습니다. Pi 문서는 이 규칙을 문장으로 명시하지 않지만, 호환 엔드포인트 예시에서는 Ollama용으로 http://localhost:11434/v1을 사용합니다. 2026년 9월 22일 문서가 갱신되기 전에는 OpenRouter, Vercel AI Gateway, llama.cpp 예시에도 같은 버전 경로가 포함되어 있었습니다. 따라서 OpenAI 호환 엔드포인트에는 https://api.kunavo.com/v1 같은 /v1 루트를 사용합니다. anthropic-messages의 경우는 명확히 정해지지 않았습니다. 이전 문서에는 /v1이 있는 예시와 없는 예시가 모두 있었으며, 갱신 때 어느 쪽도 선택하지 않고 두 예시를 모두 삭제했습니다.

사용자 지정 Pi 공급자의 바닥글에 $0이 표시되는 이유는 무엇인가요?

Pi는 사용자 지정 모델의 cost 객체를 모두 0으로 기본 설정하기 때문입니다(소스 코드 v0.99.2). 바닥글은 엔드포인트의 실제 요금이 아니라 카탈로그에 등록된 값을 표시합니다. 무료라는 뜻이 아닙니다. 공급자 자체의 가격표를 확인해 백만 토큰당 입력, 출력, cacheRead, cacheWrite 요금과 해당하는 요금 구간을 입력하기 전까지는 해당 숫자의 근거가 없다는 뜻입니다. 파일을 편집하는 김에 이웃한 기본값 두 개도 확인하세요. contextWindow는 128000, maxTokens는 16384로 대체됩니다. 둘 다 명시적으로 설정하지 않으면 더 큰 컨텍스트 창을 지원하는 모델도 일찍 압축되고 응답이 짧게 잘립니다.

Kunavo는 Pi 코딩 에이전트를 테스트했나요?

아니요. 이 페이지의 구성은 표시된 날짜에 Pi의 공식 문서를 읽고, 9월 22일 문서 갱신에서 빠진 내용은 Pi의 릴리스된 소스 코드를 읽어 확인했습니다. 그러나 이 클라이언트로 해당 엔드포인트에 연결해 세션, 스트리밍 턴, 도구 왕복 호출, 모델 라우팅을 확인하는 테스트는 수행하지 않았습니다. 이 섹션의 다른 모든 클라이언트도 마찬가지입니다. 설정 블록은 Pi 스키마에서 허용하는 구성을 참고하는 용도로만 사용하고, 위의 curl 명령으로 엔드포인트와 키를 확인한 뒤 시도하는 동안 작동 중인 경로를 사용할 수 있도록 유지하세요.