문서

문서

DeepSeek Harness

DeepSeek Harness에는 기존 DeepSeek 카드가 그대로 있고, 여기에 사용자 공급자를 추가할 수 있습니다. “Add model provider” → “Custom model API” 아래의 다섯 개 필드를 입력하면 하나의 키로 Claude와 GPT를 같은 모델 선택기에서 사용할 수 있습니다.

Settings → Models → “Add model provider” → “Custom model API”에서 다섯 필드 — Provider ID, 표시 이름, 기본 URL, API 프로토콜, API 키 — 를 입력하면 Claude와 GPT가 내장 DeepSeek 카드와 같은 선택기에 표시됩니다

Settings → Models → Add model provider → Custom model API
# Settings → Models → Add model provider → Custom model API
#
#   Provider ID     kunavo          (lowercase, and permanent)
#   display name    Kunavo
#   base URL        https://api.kunavo.com/v1
#   API protocol    OpenAI Chat Completions   (openai-completions)
#   API key         sk-kn-...
#
# Then Model catalog → Fetch available models → Add selected,
# or type the ids by hand. The page writes the active profile's
# $DSH_HOME/profiles/<profile>/cordis.patch.yml — profile "web" under
# `dsh web`. The same provider there, plus an optional second one
# that sends Claude ids over Anthropic Messages, whose base URL has
# NO /v1. This entry replaces the whole llm-pi-ai config: keep any
# provider already in it.

- id: llm-pi-ai
  config:
    providers:
      kunavo:
        apiKeyEnv: KUNAVO_API_KEY
        api: openai-completions
        baseURL: https://api.kunavo.com/v1   # → /v1/chat/completions
        models:
          - id: claude-sonnet-5
          - id: claude-opus-5
          - id: claude-haiku-4-5
          - id: gpt-5-6-sol
      kunavo-claude:
        apiKeyEnv: KUNAVO_API_KEY
        api: anthropic-messages
        baseURL: https://api.kunavo.com      # → /v1/messages
        models:
          - id: claude-sonnet-5
          - id: claude-haiku-4-5
기본 URL은 API 프로토콜에 따라 다릅니다. openai-completions에는 https://api.kunavo.com/v1를 사용하고, anthropic-messages에는 https://api.kunavo.com를 사용합니다. /v1는 붙이지 않습니다. dsh가 직접 /v1/messages를 추가하기 때문입니다. 요청을 기록하는 모의 엔드포인트를 대상으로 dsh 0.2.0-rc.2를 실행해 두 경우를 확인했습니다. 첫 번째는 /v1/chat/completions로 요청을 보냈고, 두 번째는 기본 경로에서 /v1/messages?beta=true로 요청을 보냈습니다. 기본 URL에 /v1가 남아 있으면 /v1/v1/messages로 요청을 보내며, 실제 게이트웨이는 인증 오류가 아니라 404를 반환합니다.
reasoningEfforts는 시스템 프롬프트가 전달되는지가 아니라 그 역할을 바꿉니다. Harness 문서에 따르면, 추론 기능을 선언한 모델에는 시스템 프롬프트가 role: "developer"로 전송됩니다. Kunavo는 Claude를 포함한 모든 모델 계열에서 해당 역할을 시스템 턴으로 처리하므로 compat 전환은 필요하지 않습니다. 2026-09-30까지는 Claude 경로에서 해당 역할을 누락했기 때문에 이 안내 카드에서는 compat.supportsDeveloperRole: false를 설정하도록 안내했습니다. 설정해 두었다면 문제를 일으키지 않으므로 그대로 두어도 됩니다.
Kunavo는 DeepSeek 모델을 제공하지 않습니다. 이 공급자는 DeepSeek 카드를 대체하는 것이 아니라 그 옆에 추가됩니다. deepseek- ID에는 기존 DeepSeek 키를 계속 사용하고, 아래 표의 Claude 및 GPT ID에는 이 키를 사용하세요. 따라서 Harness 문서에서 “OpenAI 호환 게이트웨이를 통한 DeepSeek V4”에 사용하도록 안내하는 compat.thinkingFormat: deepseek 전환도 여기서는 적용할 대상이 없습니다.
세션 로그는 함께 전송되지 않습니다. 내장 DeepSeek 경로에서는 dsh가 모델에 표시되지 않는 두 필드를 각 요청에 추가합니다. 세션 이벤트와 작업 디렉터리 경로가 포함된 dsh_session_log 및 dsh_plugin_packages입니다. 테스트 실행에서 두 사용자 지정 공급자 모두 이 필드를 전송하지 않았으므로 Kunavo 공급자도 이를 받지 않습니다. 이 필드의 분량과 업로드를 끄는 설정은 DeepSeek Harness 요금 안내에서 확인할 수 있습니다.
Kunavo의 누구도 DeepSeek Harness를 Kunavo 엔드포인트에 연결해 실행한 적이 없습니다. 아래 날짜에 실행한 테스트는 다음과 같습니다. npm에서 설치한 dsh 0.2.0-rc.2를 헤드리스 모드로 실행하고, 각 경로에서 새 세션 세 개씩을 로컬 모의 엔드포인트에 연결했습니다. 이 엔드포인트는 각 요청을 기록하고 도구 호출 하나로 응답했습니다. Kunavo도 모델도 사용하지 않았습니다. 총 아홉 세션 모두 스트리밍 방식의 도구 왕복을 완료했고 매번 같은 바이트를 전송했으므로, 이 페이지에 설명된 경로와 제한을 확인할 수 있습니다. 이 결과는 Kunavo의 인증, 라우팅 또는 모델 응답에 관해서는 아무것도 입증하지 않습니다. 아래의 curl는 Kunavo 측을 확인하는 부분이며, 10초면 확인할 수 있습니다. dsh는 개발자 프리뷰로, 계속 변경되고 있습니다.
Kunavo는 임베딩, 텍스트 음성 변환 또는 음성 텍스트 변환 모델을 제공하지 않으므로 이 공급자는 채팅 완료 요청만 처리합니다. 오디오를 전사하거나 벡터 인덱스를 만드는 Harness 플러그인은 기존 공급자 키를 그대로 사용합니다. 이 공급자를 추가해도 해당 요청의 경로는 바뀌지 않습니다.
아직 키가 없나요? Kunavo 계정을 만들고, 키를 생성한 다음(키는 sk-kn-로 시작합니다) $10부터 크레딧을 추가하세요. 호출 비용은 해당 잔액에서 차감되며 실패한 호출에는 요금이 부과되지 않습니다. 그러면 대시보드가 DeepSeek Harness 설정 화면에서 열립니다.

단계별 안내

  1. /app/keys에서 키를 생성해 복사하세요. 키는 한 번만 표시됩니다.
  2. 웹 UI(dsh web)를 시작하고 Settings → Models로 이동합니다. Add model provider를 선택합니다. 처음에는 Third-party model provider 카드가 열리며, 여기에 dsh에서 제공하는 공급자만 표시됩니다. Custom model API로 전환하세요.
  3. Provider ID(소문자로 입력하며 변경할 수 없음 — 문서에 따르면 요청, 저장된 세션, 모델 기본값, 자격 증명 참조가 모두 이 ID를 사용합니다. 이름을 바꾸려면 새 공급자를 추가하고 기존 공급자를 삭제해야 합니다), 표시 이름, 기본 URL https://api.kunavo.com/v1, API 프로토콜 OpenAI Chat Completions, API 키를 입력합니다. 키는 쓰기 전용입니다. dsh는 키를 $DSH_HOME/.credentials.yaml에 보관하고 프로필에는 키 참조만 저장합니다.
  4. Model catalog에서 Fetch available models를 선택합니다. Kunavo가 GET /v1/models를 반환하므로 모델 선택기가 자동으로 채워집니다. 사용할 모델을 선택한 다음 Add selected를 선택합니다. ID를 직접 입력해도 되며, 검색 결과가 비어 있을 때는 직접 입력하도록 문서에서 안내합니다.
  5. 선택 사항: Claude ID에 Anthropic 자체 프로토콜을 사용하려면 별도의 Provider ID와 기본 URL https://api.kunavo.com(/v1 제외), API 프로토콜 Anthropic Messages, 동일한 키를 사용하는 두 번째 사용자 지정 모델 API를 추가합니다. 여기서도 Fetch로 전체 카탈로그가 표시되므로 claude- ID만 추가하세요(그 이유).
  6. 작성기에서 모델을 선택하고 인사말 대신 파일에 영향을 주는 요청을 보내세요. Harness는 대부분의 작업에서 도구 호출을 사용하므로, 첫 실행에서 파일을 읽고 수정해 보면 더 많은 것을 확인할 수 있습니다. 모델 변경은 다음 요청부터 적용되며, 문서에 따르면 재시작할 필요가 없습니다.

DeepSeek Harness의 “Configure models” 페이지(dsh-v0.2.0-rc.2 태그의 docs/user/guide/providers.md와 동일한 내용)에서 확인했습니다(2026년 10월 1일 기준). 서드파티 설정은 변경될 수 있으므로, 여기의 필드 이름이 실제 화면과 다르면 이 문서가 아니라 해당 페이지를 기준으로 삼으세요.

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

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

# 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 입력/출력DeepSeek Harness에서의 위치
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동일한 키와 공급자를 사용해 다른 모델 계열의 답변을 확인
gpt-5-6-terra$0.70 / $4.20토큰당 요율이 청구액을 결정하는 긴 입력
월정액 없이 선불 잔액에서 토큰별로 청구됩니다. billing을 참고하세요. 반복되는 컨텍스트(에디터나 채팅 클라이언트가 보내는 데이터의 대부분)에서는 모델 선택보다 프롬프트 캐싱이 청구액에 더 큰 영향을 줍니다.

Anthropic Messages를 통한 Claude

Kunavo는 Anthropic Messages API에도 응답하며 anthropic-messages는 양식에서 제공하는 세 프로토콜 중 하나입니다. Harness 문서는 “공급자 하나는 프로토콜 하나를 사용하므로, 두 프로토콜을 제공하는 게이트웨이는 공급자 두 개가 필요합니다”라고 명시합니다. 따라서 이는 첫 번째 공급자의 설정이 아니라 그 옆에 추가하는 두 번째 공급자입니다.

  • 기본 URL https://api.kunavo.com, 기본 경로를 사용합니다. 테스트 실행에서 이 기본 경로는 /v1/messages?beta=true로 요청을 보냈습니다. Claude Code가 사용하는 경로이며 Kunavo도 응답합니다. 끝에 /v1를 붙이면 /v1/v1/messages로 요청을 보냈습니다. DeepSeek Harness와 Claude Code 비교에서 두 클라이언트의 요청을 나란히 확인할 수 있습니다.
  • Claude ID만 사용합니다. Kunavo의 /v1/messages는 claude- ID만 처리합니다. 다른 ID를 입력하면 gpt-가 /v1/chat/completions를 명시하는 404를 반환합니다. GPT에는 openai-completions 공급자를 사용하세요.
  • Fetch에는 모든 모델이 표시되므로 Claude 모델만 추가하세요. dsh의 llm-pi-ai README에 따르면 이 프로토콜의 검색 요청은 Anthropic의 x-api-key 헤더와 함께 GET /v1/models로 전송됩니다. Kunavo의 모델 목록은 Authorization: Bearer에서와 마찬가지로 해당 헤더의 키를 사용합니다. 이는 dsh 소스 코드와 Kunavo 자체 테스트를 근거로 한 내용이며 이번 실행에서 확인한 것은 아닙니다. Fetch available models에는 GPT와 이미지 모델까지 전체 카탈로그가 표시되므로 claude- ID만 선택하세요. 직접 입력해도 동일하게 작동합니다. 전체 목록이 표시된다고 해서 확인할 수 있는 내용은 제한적입니다. 같은 README에 따르면 모델 목록 URL에는 끝에 /v1를 붙여도 되고 붙이지 않아도 되지만, 모델 요청에서는 기본 URL을 그대로 사용합니다. 따라서 Fetch는 https://api.kunavo.com/v1에서도 목록을 가져오며, 해당 기본 URL로 보내는 첫 턴은 /v1/v1/messages로 전송됩니다.
  • 이 방식으로 얻는 이점. 요청은 Anthropic 형식으로 도착합니다. 테스트 실행에서는 시스템 프롬프트가 최상위 system 필드로 전달되어 developer 역할은 사용되지 않았습니다. Kunavo는 OpenAI 형식에서 변환하지 않고 요청을 그대로 전달합니다. openai-completions 공급자도 변환을 거쳐 같은 Claude ID에 연결되므로 사용 안내에서는 해당 공급자를 선택했습니다.

양식이 저장하는 파일

Models 페이지는 $DSH_HOME/profiles/<profile>/cordis.patch.yml를 작성합니다. dsh web로 시작하면 $DSH_HOME/profiles/web/cordis.patch.yml에 저장됩니다. 예전 dsh 문서는 $DSH_HOME/settings.yaml를 가리켰지만 0.2.0-rc.2 문서에는 그렇게 되어 있지 않습니다. 브라우저와 서버가 같은 컴퓨터에 있으면 Settings 헤더의 Open configuration file을 눌러 파일을 열 수 있으며, 어댑터는 다음 요청 시 이 파일을 다시 읽습니다. 이 엔드포인트에는 다음 다섯 가지 설정이 중요합니다.

  1. 컨텍스트 창 및 최대 출력 토큰 — 양식에서 Customized settings → Model options에 있습니다. 직접 입력한 ID에는 두 값이 모두 없으므로 경로의 기본값이 적용됩니다. llm-pi-ai README에 따르면 컨텍스트는 262,144 토큰, 출력은 32,768 토큰이며 테스트 실행에서 두 사용자 지정 공급자 모두 정확히 max_tokens: 32768를 요청했습니다. 위 표의 모든 ID는 이보다 많은 값을 지원합니다. 어느 경우든 해당 행을 확인하고 더 큰 값을 원하면 모델의 카탈로그 항목에서 값을 높이세요. Kunavo는 한도가 아니라 모델이 생성한 토큰에 대해 요금을 청구합니다.
  2. compat.supportsDeveloperRole — 필요하지 않습니다. Harness에서는 developer 역할을 거부하는 게이트웨이에 이 설정을 권장하지만, Kunavo는 Claude를 포함한 모든 모델 계열에서 해당 역할을 시스템 턴으로 처리합니다. (2026-09-30까지는 Claude 경로에서 이 역할을 누락해 이 항목에서 전환을 설정하도록 안내했습니다. 설정을 그대로 두어도 문제없습니다.)
  3. compat.maxTokensField — 기본값 그대로 두세요. Harness에서는 보통 위 전환과 함께 첫 번째 해결 방법으로 사용하지만, Kunavo 자체 핸들러는 max_completion_tokens를 읽고 max_tokens를 대체값으로 사용하므로 기본값으로 이미 작동합니다.
  4. reasoningEfforts — 양식에 입력란이 없습니다. 직접 입력한 모델에는 추론 수준이 선언되어 있지 않으므로 Effort 메뉴가 표시되지 않고, 모델의 추론 여부는 엔드포인트 자체의 기본 설정에 따라 결정됩니다. 메뉴를 사용하려면 수준을 직접 선언하세요. openai-completions에서는 각 키가 수준이고 각 값은 reasoning_effort로 전송되는 표기입니다. 이렇게 하면 gpt- ID에 적용됩니다. claude- ID에는 적용되지 않습니다. Kunavo의 채팅 인터페이스는 reasoning_effort를 Anthropic에 전달하지 않기 때문입니다(/docs/chat#reasoning).
  5. 입력 유형(파일에서는 input: [text, image]) — 문서에 따르면 이는 “엔드포인트를 확인하는 것이 아니라 엔드포인트에 관한 주장을 지정하는 것”입니다. 이미지 입력을 지원하지 않는 ID에서 Image를 선택해도 Harness는 이를 감지하지 못하며, 이후 단계에서 요청이 거부됩니다. 체크하기 전에 /models에서 해당 ID를 확인하세요.

세션에서 전송하는 나머지 항목, 즉 턴마다 전송되는 도구 정의 24개, 새 세션마다 보내는 짧은 제목 요청, DeepSeek 자체 경로의 추가 필드에 대한 요금은 DeepSeek Harness 요금 안내에서 확인할 수 있습니다.

자주 묻는 질문

DeepSeek Harness에 사용자 지정 API 공급자를 어떻게 추가하나요?

dsh web으로 웹 UI를 시작하고 Settings → Models로 이동한 다음 "Add model provider"를 선택합니다. 처음에는 "Third-party model provider" 카드가 열리며, 여기에 dsh에서 제공하는 공급자만 표시됩니다. "Custom model API"로 전환하세요. 양식에 소문자로 된 Provider ID, 표시 이름, 기본 URL, API 프로토콜, API 키를 입력한 뒤 Model catalog에서 모델을 하나 이상 추가합니다. Provider ID는 변경할 수 없습니다. 요청, 저장된 세션, 모델 기본값, 자격 증명 참조가 모두 이 ID를 사용하기 때문입니다. 이름을 바꾸려면 새 공급자를 추가하고 기존 공급자를 삭제해야 합니다. 0.2.0-rc.2에서는 페이지 설정이 활성 프로필의 cordis.patch.yml에 저장됩니다. dsh web을 사용할 때는 경로가 $DSH_HOME/profiles/web/cordis.patch.yml입니다.

DeepSeek Harness의 기본 URL은 끝에 /v1을 붙여야 하나요?

API 프로토콜에 따라 다릅니다. openai-completions에는 /v1을 붙여야 합니다. https://api.kunavo.com/v1을 사용하면 dsh 0.2.0-rc.2 테스트에서 /v1/chat/completions로 요청을 보냈습니다. anthropic-messages에는 붙이지 않습니다. https://api.kunavo.com을 사용해야 dsh가 /v1/messages를 직접 추가합니다. 기본 경로에서는 /v1/messages?beta=true로 요청을 보냈지만, 기본 URL이 /v1로 끝나면 /v1/v1/messages로 요청을 보냅니다. 실제 게이트웨이는 인증 오류 대신 404를 반환합니다. 이 테스트는 Kunavo가 아니라 요청을 기록하는 로컬 모의 엔드포인트를 대상으로 했습니다.

DeepSeek Harness에서 DeepSeek 대신 Claude 또는 GPT 모델을 사용할 수 있나요?

예. API 프로토콜 필드는 공급업체가 아니라 전송 형식을 나타냅니다. openai-completions는 OpenAI Chat Completions, openai-responses는 Responses API, anthropic-messages는 Anthropic Messages API입니다. 사용자 지정 공급자는 설정한 기본 URL에 모델 ID를 그대로 전달하므로, Claude 또는 GPT ID는 Harness 내부가 아니라 해당 엔드포인트에서 확인됩니다. Kunavo에서는 https://api.kunavo.com/v1을 사용하는 openai-completions 공급자로 Claude와 GPT ID에 연결할 수 있습니다. https://api.kunavo.com에서 anthropic-messages를 사용하는 두 번째 공급자는 Anthropic 고유의 요청 형식으로 Claude ID에만 연결됩니다. 둘 다 내장 DeepSeek 카드 옆에 추가되며 기존 카드를 대체하지 않으므로 DeepSeek ID에는 계속 DeepSeek 키가 사용됩니다.

DeepSeek Harness는 사용자 지정 공급자에 무엇을 전송하나요?

dsh 0.2.0-rc.2를 기록한 테스트에서 두 사용자 지정 공급자(openai-completions 및 anthropic-messages)는 에이전트 턴마다 도구 정의 24개를 전송하고 max_tokens 32,768을 요청했습니다. 이는 크기를 지정하지 않고 직접 입력한 모델에 Harness가 적용하는 기본값입니다. 또한 새 세션마다 max_tokens 64로 짧은 제목 요청을 한 번 보냈습니다. dsh_session_log 또는 dsh_plugin_packages는 어느 쪽도 전송하지 않았습니다. 이 두 필드에는 세션 이벤트 로그와 설치된 플러그인 목록이 포함되며 내장 DeepSeek 경로에서만 전송됩니다. 이 테스트에서는 Kunavo가 아닌 요청을 기록하는 모의 엔드포인트를 사용했으므로, dsh가 전송하는 내용만 보여주며 각 공급자가 이를 어떻게 처리하는지는 보여주지 않습니다.

DeepSeek Harness가 시스템 프롬프트를 무시하는 것처럼 동작하는 이유는 무엇인가요?

모델에 추론 수준이 선언되어 있는지 확인하세요. openai-completions에서는 Harness가 추론 모델의 시스템 프롬프트를 role "system"이 아니라 role "developer"로 전송합니다. 엔드포인트 URL을 기준으로 요청 형식을 추론하고, OpenAI 자체의 주소로 인식되지 않는 주소를 사용하기 때문입니다. Kunavo는 Claude를 포함한 모든 모델 계열에서 해당 역할을 시스템 턴으로 처리하므로 Kunavo에서는 어느 역할로 전송해도 프롬프트가 도착합니다. 2026-09-30까지는 Claude 경로에서 해당 역할을 조용히 누락했습니다. 그 전에 프롬프트가 누락되었다면 이것이 원인이며, 프로필의 cordis.patch.yml에서 경로나 모델에 compat.supportsDeveloperRole: false를 설정하는 것이 해결 방법이었습니다. 이제는 필요하지 않으며 설정을 그대로 두어도 문제없습니다. anthropic-messages 공급자는 해당 역할을 전송하지 않습니다. 시스템 프롬프트는 Anthropic의 최상위 system 필드로 전송됩니다.

DeepSeek Harness에서 "Fetch available models"가 아무것도 반환하지 않거나 401 오류를 반환하는 이유는 무엇인가요?

모델 검색은 양식에 현재 입력된 기본 URL, 프로토콜, 키를 사용합니다. 따라서 401은 대개 키에 문제가 있음을, 빈 목록은 기본 URL이나 검색이 읽지 못하는 목록 형식에 문제가 있음을 나타냅니다. Harness는 두 경우 모두 문서화하고 모델 ID를 직접 입력하도록 안내하며, 직접 입력해도 동일하게 작동합니다. 두 프로토콜은 키를 다르게 전송합니다. openai-completions는 Authorization: Bearer로, anthropic-messages는 Anthropic의 x-api-key 헤더로 전송하며 Kunavo의 모델 목록은 둘 중 어느 쪽도 허용합니다. 같은 키와 헤더를 사용해 https://api.kunavo.com/v1/models에 일반 curl 요청을 보내면 어느 쪽에 문제가 있는지 확인할 수 있습니다. JSON 응답은 양식 문제, 401은 키 문제, 404는 URL 문제를 의미합니다. anthropic-messages에서 전체 목록을 받았더라도 두 가지는 여전히 확인해야 합니다. 검색은 목록 URL에서 끝의 /v1 하나를 제거하지만 모델 요청에는 그러지 않으므로 기본 URL이 올바른지 확인해야 합니다. 또한 목록에는 전체 카탈로그가 표시되지만 해당 공급자에서는 claude- ID만 작동하므로 공급자가 호출할 수 있는 ID를 확인해야 합니다. 내장 공급자는 기본 URL이 다른 곳을 가리키더라도 항상 설치된 카탈로그에서 응답을 받으므로, 엔드포인트가 실제로 제공하는 내용을 확인하려면 사용자 지정 공급자를 통해 가져오세요.