TL;DR
OpenCode에서 CometAPI를 한 번만 설정한 뒤, 프로그래밍 작업에 Claude, GPT, 또는 DeepSeek을 선택하세요. 본 가이드는 공식 CometAPI OpenCode 통합 가이드를 완전한 프로젝트 설정으로 확장합니다: 하나의 CometAPI API 키, 세 가지 모델 예시가 담긴 구성 파일, 모델 전환 명령, 반복 가능한 검증을 포함한 작은 JavaScript 작업.
핵심 요약
- OpenCode의 CometAPI 설정에는 provider ID, API base URL, credential, model ID가 필요합니다.
- 실제 API 키는 opencode.json 밖에 두기 위해 {env:COMETAPI_KEY}를 사용하세요.
- 하나의 opencode.json에 Claude, GPT, DeepSeek 예시를 모두 등록합니다. 세 항목 모두 동일한 CometAPI 키와 게이트웨이를 사용합니다.
- OpenCode에서 별도의 Anthropic, OpenAI, DeepSeek 키 없이 공급자/모델을 전환할 수 있습니다.
- 누락된 환경 변수, 일치하지 않는 API 경로, 정지된 요청처럼 보일 수 있는 승인 프롬프트를 주의하세요.
OpenCode란 무엇이며, CometAPI와 함께 사용하는 이유는?
OpenCode는 터미널 인터페이스, 데스크톱 앱, IDE 확장을 제공하는 오픈 소스 AI 코딩 에이전트입니다. 프로젝트에서 기존 코드를 설명하고, 변경 계획을 세우며, 파일을 편집하고, 구성된 권한 하에서 명령을 실행할 수 있습니다. 이 튜토리얼은 터미널 워크플로를 사용합니다: 에이전트에 작은 프로그래밍 작업을 주고, 제안된 작업을 검토한 후, 로컬 테스트로 결과 파일을 검증합니다. 설치 및 사용법은 공식 OpenCode 문서를 참고하세요.
CometAPI는 모델 접근 레이어를 제공합니다. 다중 모델 워크플로는 보통 공급자별 자격 증명, 결제, 연결 설정을 관리해야 합니다. 지원 모델을 하나의 CometAPI 계정으로 라우팅하면 이 프로젝트는 공용 키와 base URL을 공유하고, OpenCode는 저장소와 작업 지시를 유지합니다. 동일 작업에서 모델을 비교하거나 선택 모델을 바꿀 때 프로젝트 구조 변경 없이 유용합니다. 집계 게이트웨이는 선택 사항이며, 단일 공급자 워크플로 또는 특정 계약 조건에는 공급자 직접 접근이 더 적합할 수 있습니다. 여기서의 이점은 다중 공급자 접근 단순화입니다. 다만 API 형식, 모델 동작, 도구 호환성은 별도로 검증해야 합니다.
CometAPI는 OpenAI 호환 Chat Completions를 지원하며, 다른 API 형식도 노출합니다. 공식 통합은 형식마다 어댑터를 선택합니다. 여기서는 Claude Sonnet 5가 Messages, GPT-6.1 Sol이 Responses, DeepSeek V4.1 Flash가 Chat Completions를 사용하며, 아래 예시를 따릅니다. 모든 요청은 동일한 키로 CometAPI에 전송됩니다. 공급자 이름과 API 형식은 다른 개념입니다. 단일 모델이 모든 형식을 수용한다고 가정하면 안 됩니다.
| 구성 | CometAPI의 Claude Sonnet 5 API | CometAPI의 GPT-6.1 Sol API | CometAPI의 DeepSeek V4.1 Flash API |
|---|---|---|---|
| 모델 공급자 | Anthropic | OpenAI | DeepSeek |
| 모델 ID | claude-sonnet-5 | gpt-6.1-sol | deepseek-v4.1-flash |
| OpenCode provider ID | cometapi-messages | cometapi-responses | cometapi-chat |
| 여기서 사용한 API 형식 | Messages | Responses/ chat | Chat Completions |
| 어댑터 | @ai-sdk/anthropic | @ai-sdk/openai | @ai-sdk/openai-compatible |
CometAPI를 OpenCode에 구성하기 전에 무엇이 필요하나요?
터미널, npm이 포함된 Node.js, API 접근과 사용 가능 잔액이 있는 CometAPI 계정, 그리고 임시 프로젝트 디렉터리가 필요합니다. Bash 예시는 macOS, Linux, 또는 WSL에 적용됩니다. 표시된 PowerShell 예시는 Windows 구문을 사용합니다. 이 가이드의 후반 JavaScript 검증을 위해 동일 세션에서 Node.js를 사용할 수 있어야 합니다.
이 연습은 OpenCode 1 구성 스타일을 사용합니다. 공식 문서는 OpenCode 1과 OpenCode 2를 구분하지만, 둘 다 opencode 명령을 사용합니다. 시작 전에 opencode --version을 기록하고 해당 메이저 버전의 구성 문서를 사용하세요. 아래의 3-모델 워크플로는 기대 결과가 있는 통합 안내이며, 완전한 엔드투엔드 테스트 완료를 주장하지 않습니다.
예시를 실행할 때 CLI, Node.js, npm, 운영 체제, 테스트 날짜를 기록하세요. API 사용량은 CometAPI 계정에 청구됩니다. 아래 명령은 기대 결과를 가진 실습용 안내이며, 모델 생성 출력 또는 3-모델 통합의 성공적인 실행을 주장하지 않습니다.
node --versionnpm --versionopencode --version
CometAPI를 OpenCode에 단계별로 구성하는 방법?
1단계: OpenCode 설치
OpenCode가 아직 없다면 공식 npm 패키지를 설치하세요. 고정되지 않은 설치는 현재 패키지 릴리스를 따릅니다. 구성 사용 전에 설치된 버전을 기록하세요. 소스 가이드의 환경을 재현해야 한다면, 명시된 CLI 버전은 1.18.16입니다.
OpenCode CLI를 설치하고 버전을 표시합니다.
npm install -g opencode-aiopencode --version
설치 후 실행 파일을 찾을 수 없다면 새 터미널을 여세요. 첫 에이전트 작업의 경계를 명확히 하기 위해 임시 프로젝트 디렉터리 안에서 계속 진행합니다.
프로젝트 디렉터리를 만들고 진입합니다.
mkdir cometapi-opencode-democd cometapi-opencode-demo
2단계: CometAPI API 키 생성
CometAPI 계정에서 API 키를 생성하고 OpenCode를 시작할 동일한 터미널에 설정하세요. 로컬에서 플레이스홀더를 교체합니다. 키를 커밋하거나, 프롬프트에 붙여넣거나, 공유 로그에 포함하지 마세요.
변수는 현재 셸과 그로부터 실행된 프로세스에 적용됩니다. 실제 토큰을 스크린샷으로 찍지 마세요. 아래 점검은 값을 출력하지 않고 변수 존재 여부만 보고합니다.
현재 Bash 세션에 CometAPI 키를 설정합니다.
export COMETAPI_KEY="YOUR_COMETAPI_KEY"
현재 PowerShell 세션에 CometAPI 키를 설정합니다.
$env:COMETAPI_KEY = "YOUR_COMETAPI_KEY"test -n "$COMETAPI_KEY" && printf "COMETAPI_KEY is set\n" || printf "COMETAPI_KEY is missing\n"if ([string]::IsNullOrWhiteSpace($env:COMETAPI_KEY)) { "COMETAPI_KEY is missing"} else { "COMETAPI_KEY is set"}
3단계: opencode.json 생성
프로젝트 루트에 opencode.json을 생성하거나, 여러 프로젝트에서 항목을 재사용하려면 ~/.config/opencode/opencode.json을 사용하세요. 프로젝트 파일을 사용해 본 튜토리얼을 자체 포함형으로 유지합니다. 아래 세 항목을 포함하는 단일 provider 객체를 사용하세요. 이미 provider 객체가 있다면, 중복 JSON 키를 만들지 말고 그 안에 항목을 병합하세요.
충돌하는 필드에 대해서는 프로젝트 구성이 전역 구성보다 우선합니다. 충돌하지 않는 필드는 유지됩니다. 사용자 지정 OPENCODE_CONFIG 파일은 전역과 프로젝트 구성 사이에 로드됩니다. 관리형 또는 인라인 설정이 있는 경우 문서화된 우선순위 체인을 확인하세요.
다음의 완전한 구성을 opencode.json으로 저장하세요. 각 provider는 환경에서 COMETAPI_KEY를 읽습니다. 일부러 기본 모델을 생략했으므로, 세 가지 예시 중 하나를 명시적으로 선택할 수 있습니다.
Flash 변형은 요청된 DeepSeek V4.1 예시를 명시합니다. 도구 사용을 위해 GPT는 Responses 어댑터에 유지하세요. CometAPI DeepSeek 가이드는 여기서 사용한 Chat Completions 경로를 문서화합니다. 실행 전 계정의 모델 가용성과 권한을 다시 확인하세요.
{ "$schema": "https://opencode.ai/config.json", "provider": { "cometapi-messages": { "npm": "@ai-sdk/anthropic", "name": "CometAPI Claude", "options": { "baseURL": "https://api.cometapi.com/v1", "apiKey": "{env:COMETAPI_KEY}" }, "models": { "claude-sonnet-5": { "name": "Claude Sonnet 5" } } }, "cometapi-responses": { "npm": "@ai-sdk/openai", "name": "CometAPI GPT", "options": { "baseURL": "https://api.cometapi.com/v1", "apiKey": "{env:COMETAPI_KEY}" }, "models": { "gpt-6.1-sol": { "name": "GPT-6.1 Sol" } } }, "cometapi-chat": { "npm": "@ai-sdk/openai-compatible", "name": "CometAPI DeepSeek", "options": { "baseURL": "https://api.cometapi.com/v1", "apiKey": "{env:COMETAPI_KEY}" }, "models": { "deepseek-v4.1-flash": { "name": "DeepSeek V4.1 Flash" } } } }, "permission": { "edit": "ask", "shell": "ask" }}
정확한 baseURL: https://api.cometapi.com/v1. 잘못된 baseURL: https://api.cometapi.com/v1/chat/completions. 엔드포인트 경로는 어댑터가 추가합니다. 예시는 기존 opencode.json에 병합하되 관련 없는 설정은 제거하지 마세요.
edit 및 shell 설정은 현재 OpenCode 권한 규칙에 따라 파일 변경과 명령 실행에 승인을 요청합니다. 코딩 예시는 대화형으로 실행하고 해당 요청을 확인하세요. OpenCode는 또한 시작 프로세스의 운영 체제 접근 권한을 상속하므로, 이 연습에는 임시 디렉터리를 사용하세요.
4단계: 게이트웨이 연결 점검
아래의 선택적 Gemini 설정과 검증은 세 모델 연결 점검 이후에 제공됩니다.
아래 HTTP 예시는 DeepSeek Chat Completions 항목을 직접 점검합니다. OpenCode에서 게이트웨이 연결을 분리해 문제를 파악하는 유용한 방법입니다. Claude와 GPT는 다음 단계에서 선택된 어댑터 경로를 사용합니다. 이 HTTP 요청에서 모델 ID만 바꾼다고 프로토콜이 자동으로 변경되지는 않습니다.
Bash에서 최소 Chat Completions 요청을 보냅니다.
curl --silent --show-error \ --output response.json \ --write-out "HTTP %{http_code}\n" \ https://api.cometapi.com/v1/chat/completions \ -H "Authorization: Bearer $COMETAPI_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"deepseek-v4.1-flash","messages":[{"role":"user","content":"Reply with a short greeting."}]}'
이 명령은 curl write-out과 output 옵션을 사용해 HTTP 상태를 response.json과 분리합니다. 전송이 성공해도 HTTP 오류가 포함될 수 있으므로, 출력된 상태와 JSON 본문을 확인하세요. 이는 curl 7.76.0 이상이 필요한 --fail-with-body에 의존하지 않도록 합니다.
셸별 JSON 인용이 필요 없는 PowerShell에서 동일 요청을 보냅니다.
$body = @{ model = "deepseek-v4.1-flash" messages = @(@{ role = "user"; content = "Reply with a short greeting." })} | ConvertTo-Json -Depth 4$response = Invoke-WebRequest -UseBasicParsing -Method Post ` -Uri "https://api.cometapi.com/v1/chat/completions" ` -Headers @{ Authorization = "Bearer $env:COMETAPI_KEY" } ` -ContentType "application/json" ` -Body $body$response.Content | Set-Content -Encoding UTF8 response.json"HTTP $($response.StatusCode)"
HTTP 오류가 나면 PowerShell이 마지막 두 줄이 실행되기 전에 예외를 발생시킬 수 있습니다. 그 실패에서 상태와 마스킹된 오류 세부 정보를 캡처하세요. 성공 응답으로 기록하지 마세요.
DeepSeek 요청의 예상 결과: HTTP 200과 choices[0].message.content에 비어 있지 않은 텍스트. HTTP 200만으로 수용하지 말고 저장된 response.json을 확인하세요. 아래 추가 내용은 응답 형태와 세 구성된 경로를 점검하는 방법을 보여줍니다. 예시는 설명 용도로 제공되며, 이 개정본은 실제 CometAPI 테스트 결과를 주장하지 않습니다. 텍스트만 포함한 요청은 스트리밍이나 도구 호출을 검증하지 않습니다.
예시적인 DeepSeek 응답 형태: 인사말, usage 값 및 기타 필드는 실제 요청에 따라 달라집니다. 아래 JSON은 의도적으로 축약된 예시이며, 캡처된 API 응답이 아닙니다.
{"choices":[{"message":{"role":"assistant","content":"Hello!"}}]}
실제 HTTP 요청이 성공한 후, 상태 줄에는 HTTP 200이 표시되고 response.json에는 비어 있지 않은 assistant 텍스트가 있어야 합니다. 실제 상태와 본문은 직접 실행한 결과를 유지하세요. 예시를 테스트 증거로 복사하지 마세요.
5단계: Claude, GPT, DeepSeek 간 전환
이 단계의 명령은 요청한 assistant 마커를 반환해야 합니다. 단순화된 assistant 텍스트 예시(터미널 배너, 타이밍, 메타데이터 생략):
Claude: CLAUDE_READYGPT: GPT_READYDeepSeek: DEEPSEEK_READY
이 줄들은 예상되는 내용만 보여줍니다. 터미널 기록이 아닙니다. 공급자별 실제 출력과 프로세스 종료 상태를 기록하세요. 마커 누락이나 요청 실패가 있으면 조사해야 합니다.
opencode.json이 있는 디렉터리에서 시작합니다. 구성된 각 provider의 모델을 나열한 뒤, 각 항목으로 짧은 텍스트 요청을 보냅니다. 이 명령은 선택된 모델과 어댑터를 변경합니다. CometAPI 키와 base URL은 동일하게 유지됩니다.
아래 명령으로 세 항목이 표시되고 텍스트를 반환할 수 있는지 확인합니다.
opencode models cometapi-messagesopencode models cometapi-responsesopencode models cometapi-chatopencode run --model cometapi-messages/claude-sonnet-5 "Reply exactly with: CLAUDE_READY"opencode run --model cometapi-responses/gpt-6.1-sol "Reply exactly with: GPT_READY"opencode run --model cometapi-chat/deepseek-v4.1-flash "Reply exactly with: DEEPSEEK_READY"
대화형 전환을 위해 opencode를 시작하고 /models를 입력한 후 CometAPI Claude, CometAPI GPT, 또는 CometAPI DeepSeek를 선택하세요. OpenCode는 해당 항목의 provider/model 쌍을 사용합니다. 세 개의 공급자 계정이나 API 키가 필요하지 않습니다. 환경 변수 기반 구성에서는 두 번째 자격 증명을 제공하기 위해 /connect를 사용하지 마세요. 누락된 COMETAPI_KEY는 시작 셸에서 해결해야 합니다.
예상 결과: 각 짧은 요청은 요청한 마커를 반환합니다. 모델별 실제 결과를 기록하세요. 보이는 모델 항목은 등록을 확인합니다. 성공적인 텍스트 응답은 해당 요청 경로를 확인합니다. 둘 중 하나만으로 파일 도구가 동작함을 증명할 수는 없습니다.
Gemini는 별도의 provider와 프로토콜을 사용합니다. 위의 Claude, GPT, DeepSeek 항목은 유지하고, 아래 항목을 기존 provider 객체에 병합하세요. 아래 base URL은 리뷰어가 제공한 CometAPI 구성에 따릅니다. 사용 전 CometAPI 계정에서 최신 경로와 모델 접근 권한을 확인하세요.
Google 어댑터는 사용자 지정 baseURL을 지원하며 x-goog-api-key를 사용해 apiKey를 보냅니다. AI SDK Google provider 참고 문서를 참조하세요. 이는 어댑터 설정을 확인할 뿐, 특정 Gemini 모델이 CometAPI 게이트웨이에서 활성화되어 있음을 보장하지는 않습니다.
{ "provider": { "cometapi-gemini": { "npm": "@ai-sdk/google", "name": "CometAPI Gemini", "options": { "baseURL": "https://api.cometapi.com/v1beta", "apiKey": "{env:COMETAPI_KEY}" }, "models": { "YOUR_GEMINI_MODEL_ID": { "name": "CometAPI Gemini (account-selected model)" } } } }}
YOUR_GEMINI_MODEL_ID를 JSON 키와 아래 명령 모두에서 CometAPI 계정에 활성화된 정확한 Gemini 모델 ID로 바꾸세요. 이는 플레이스홀더이며 실제 모델 ID가 아닙니다. provider 항목을 병합할 때 최상위 provider 키를 중복 생성하지 말고, COMETAPI_KEY가 설정된 동일 셸에서 OpenCode를 시작하세요.
opencode models cometapi-geminiopencode run --model cometapi-gemini/YOUR_GEMINI_MODEL_ID "Reply exactly with: GEMINI_READY"
예상 assistant 텍스트: GEMINI_READY. 표시된 모델은 로컬 등록을 확인하고, 마커 수신은 텍스트 요청을 확인합니다. 실제 응답과 종료 상태를 저장하세요. 코딩 도구를 검증하려면 새 임시 디렉터리에서 opencode --model cometapi-gemini/YOUR_GEMINI_MODEL_ID를 실행하고 아래 greet.cjs/check.cjs 작업을 반복하세요. 텍스트 성공만으로 스트리밍, 편집, 도구 호출이 검증되지는 않습니다.
Claude, GPT, DeepSeek로 코딩 작업을 어떻게 실행하나요?
각 모델에 동일한 작은 작업을 사용하세요: 인사 함수 생성, 단언 추가, 실행. 두 번째 모델이 첫 번째 모델이 만든 파일을 재사용하지 못하도록 세 개의 새 디렉터리를 유지합니다. 성능 순위가 아니라 통합 워크플로를 점검합니다.
prepare-runs.cjs를 opencode.json과 같은 위치에 저장하고 한 번 실행합니다. 이는 세 개의 새 디렉터리를 만들고 공유 구성만 복사합니다. 대상 디렉터리 중 하나라도 이미 존재하면 중단하므로 이전 작업이 덮어쓰이지 않습니다.
const fs = require("node:fs");const path = require("node:path");const root = __dirname;const names = ["claude-demo", "gpt-demo", "deepseek-demo"];const config = path.join(root, "opencode.json");if (!fs.existsSync(config)) throw new Error("Missing opencode.json");for (const name of names) { if (fs.existsSync(path.join(root, name))) { throw new Error(`Directory already exists: ${name}`); }}for (const name of names) { const dir = path.join(root, name); fs.mkdirSync(dir); fs.copyFileSync(config, path.join(dir, "opencode.json"));}node prepare-runs.cjscd claude-demoopencode --model cometapi-messages/claude-sonnet-5# After exiting OpenCode:cd ..cd gpt-demoopencode --model cometapi-responses/gpt-6.1-sol# After exiting OpenCode:cd ..cd deepseek-demoopencode --model cometapi-chat/deepseek-v4.1-flash# After exiting OpenCode:cd ..
아래 세션 중 하나씩 부모 프로젝트 디렉터리에서 시작해 실행합니다. 다음 예시로 이동하기 전에 세션을 종료하세요. 각 세션에서 동일한 작업을 제출하고 제안된 편집과 명령을 검토하세요. OpenCode를 시작하는 프로세스에서 Node.js가 사용 가능해야 합니다.
에이전트에 작은 JavaScript 함수를 만들고 검증하라고 요청하세요.
Create greet.cjs in this directory.Export a function named greet(name) that returns "Hello, " + name + "!".Create check.cjs using node:assert/strict.Assert that greet("Ada") equals "Hello, Ada!".Run node check.cjs and report its actual exit status.Do not modify opencode.json or unrelated files.
예상 결과: 에이전트가 구성된 승인 요청을 보낸 뒤 두 파일을 만들고, node check.cjs를 종료 상태 0으로 완료합니다. 실제로 발생한 일을 기록하세요. 파일을 검사하고 직접 검증을 재실행하세요. 서술형의 성공 주장은 충분하지 않습니다. 도구 호출이 거부되거나 형식이 잘못되었으면, 보류 중인 승인과 별개로 경로 호환성을 조사하세요.
참조 파일 및 로컬 검증
아래 파일들은 요청된 작업의 참조 구현입니다. 본 가이드를 위해 직접 작성되었으며, 모델이 생성한 산출물로 제시하지 않습니다. 관찰 가능한 동작이 일치하면 에이전트 실행의 수락 조건을 만족합니다.
function greet(name) { return "Hello, " + name + "!";}module.exports = { greet };const assert = require("node:assert/strict");const { greet } = require("./greet.cjs");assert.equal(greet("Ada"), "Hello, Ada!");node check.cjsprintf "exit=%s\n" "$?"node check.cjs"exit=$LASTEXITCODE"
로컬 참조 점검: Windows, Node.js v24.19.0, 2026년 10월 22일; node check.cjs는 표준 출력 없이 종료 상태 0을 반환했습니다. 이는 두 개의 참조 파일만 점검합니다. OpenCode 설치, CometAPI 접근, 승인 프롬프트, 모델 도구 호출은 검증하지 않습니다.
| 실행 | 선택된 모델 항목 | 기록할 내용 |
|---|---|---|
| Claude | cometapi-messages/claude-sonnet-5 | 응답, 생성된 파일, 승인, 테스트 종료 코드 |
| GPT | cometapi-responses/gpt-6.1-sol | 응답, 생성된 파일, 승인, 테스트 종료 코드 |
| DeepSeek | cometapi-chat/deepseek-v4.1-flash | 응답, 생성된 파일, 승인, 테스트 종료 코드 |
모델당 하나의 결과 기록을 유지하세요: 선택된 provider/model, 응답 수신 여부, greet.cjs와 check.cjs 생성 여부, 승인 표시 여부, node check.cjs의 종료 코드. 실패는 실패로 기록하고, 참조 구현으로부터 통과를 추정하지 마세요.
자격 증명 보호 및 신뢰성 검증
COMETAPI_KEY는 리포지토리 파일이나 공유 로그가 아니라 환경 변수에 저장하세요. 파일 편집과 셸 명령 승인을 활성화 상태로 유지하고, 새 구성을 임시 프로젝트에서 테스트하세요.
직접 API 요청, OpenCode 응답, 파일 편집 워크플로를 개별적으로 검증하세요. 오류와 테스트 결과를 기록하고, 일시적인 실패만 재시도하며, 중단된 작업을 반복하기 전에 작업 공간을 점검하세요.
CometAPI는 모델 전환을 단순화하지만, 본 구성만으로 OpenCode가 자동 교차-모델 장애 조치를 제공하진 않습니다. 모델을 사용할 수 없게 되면 검증된 다른 모델을 수동으로 선택하고 수락 검사를 반복하세요.
Opencode와 CometAPI 사용 비용은 얼마인가요?
CometAPI 가격 및 과금 구조
CometAPI는 월 구독료 없이 실제 API 사용량에 대해서만 과금하는 종량제 요금을 제공합니다. 공식 모델 요금은 일반적으로 공급자의 표준 가격보다 20% 낮으며, 추가 볼륨 할인도 제공됩니다. 개발자는 하나의 계정으로 Claude, GPT, DeepSeek 및 기타 모델에 접근하며, 선택한 모델의 토큰 사용량에 따라 비용을 지불합니다. 최신 요금은 CometAPI 가격 페이지를 확인하세요.
캐싱 또는 추가 수수료가 없는 요청의 경우:
Cost = (Input tokens × Input rate + Output tokens × Output rate) / 1,000,000
예를 들어, 입력 $1/M 토큰, 출력 $4/M 토큰이라는 가상의 요금에서 입력 20,000, 출력 2,000 토큰을 사용하면 비용은 $0.028입니다. 이는 예시 요금이며 실제 모델 가격이 아닙니다.
작업마다 토큰 사용량, 총 API 비용, 실행 시간, 테스트 결과를 기록하세요. 비용을 줄이려면 불필요한 컨텍스트를 제한하고, 간결한 프롬프트를 사용하며, 반복된 실패 요청을 피하고, 동일 품질 요구를 충족하는 더 저렴한 모델을 선택하세요.
OpenCode API 비용 최적화 전략
코딩 품질을 저하시키지 않으면서 OpenCode 비용을 줄이려면 모델 선택, 토큰 효율, 불필요한 API 요청 최소화에 집중하세요.
- 올바른 모델 선택: 루틴 코딩 작업에는 DeepSeek 같은 저비용 모델을 사용하고, 복잡한 디버깅·리팩터링·추론에는 Claude나 GPT를 사용하세요.
- 토큰 소비 절감: 프롬프트를 간결하게 유지하고, 관련 프로젝트 파일만 제공하며, 대용량 리포지토리 컨텍스트를 반복 전송하지 않도록 하세요.
- 프롬프트 캐싱 활용: 프로젝트 지침과 코드 참조처럼 반복되는 컨텍스트에 대해 지원되는 캐시 기능을 사용해 입력 비용을 줄이세요.
- 불필요한 재시도 방지: 재시도 전에 구성과 인증 오류를 수정하고, 중복 작업을 막기 위해 이전 출력을 검토하세요.
- 실제 지출 모니터링: CometAPI를 통해 토큰 사용량, API 비용, 작업 성공 여부를 추적하세요. 토큰 단가가 아니라 성공한 작업당 비용을 비교하세요.
CometAPI의 할인된 종량제 가격과 위 전략을 결합하면, 신뢰할 수 있는 코딩 성능을 유지하면서 지출을 통제할 수 있습니다.
CometAPI 구성을 확장하는 방법
다른 모델을 추가하려면 해당 API 형식을 지원하는 provider 아래에 모델 ID를 추가하거나, 필요한 어댑터와 함께 새 provider 항목을 추가하세요. 그런 다음 /models를 통해 해당 provider/model을 선택합니다. 자격 증명은 COMETAPI_KEY에 유지하고, 전환이 선택 작업으로 남도록 기존 항목을 유지하세요.
공식 가이드는 네 가지 API 형식을 다룹니다(Gemini 포함). 본 문서는 Claude, GPT, DeepSeek에 필요한 세 항목을 사용합니다. 여러 선택 모델이 Chat Completions를 지원한다면 하나의 cometapi-chat models 맵을 공유할 수 있습니다. Responses 전용 또는 Messages 전용 경로를 맵 수를 줄이려고 해당 맵에 옮기지 마세요.
호출하려는 경로에 따라 어댑터를 선택하고, 프로그래밍 작업에 따라 모델을 선택하세요. 공급자 변경은 새로운 CometAPI 키를 요구하지 않습니다. 그러나 API 형식 변경은 그에 맞는 구성된 어댑터를 요구합니다.
OpenCode에서 CometAPI 문제를 해결하는 방법
첫 번째 실패 단계부터 추적하세요: HTTP 요청 → OpenCode provider → 파일 도구. HTTP가 실패하면 자격 증명, 모델 접근, 엔드포인트 세부 사항을 점검하세요. HTTP가 동작하지만 OpenCode가 실패하면 구성과 실행 환경을 점검하세요. 텍스트는 동작하지만 파일 작업이 실패하면 권한 및 도구 호출 호환성을 점검하세요.
| 증상 | 1차 점검 | 다음 조치 | 진단 명령 / 근거 |
|---|---|---|---|
| 401 응답 | 키 값과 Authorization 헤더 | 현재 터미널에 키를 설정하세요. 우발적 공백을 확인하세요. | 키를 출력하지 않고 변수 존재 여부를 확인하세요. HTTP 상태와 마스킹된 오류를 보관하세요. |
| 403 또는 계정 제한 | 오류 본문과 계정 권한 | CometAPI에서 모델 접근 권한과 계정 상태를 확인하세요. | 마스킹된 오류 응답을 저장하고 계정 접근을 확인하세요. |
| 404 응답 | 호스트, 엔드포인트 경로, 모델 ID | 요청을 선택 모델의 API 문서와 비교하세요. | response.json을 요청한 모델과 엔드포인트와 비교하세요. |
| OpenCode에 모델이 없음 | 프로젝트 디렉터리와 provider 구성 | JSON 유효성과 일치하는 provider/model 이름을 확인하고, 편집 후 재시작하세요. | opencode models cometapi-chat, opencode models cometapi-messages, opencode models cometapi-responses; opencode --version을 기록하세요. |
| 텍스트 동작, 도구 실패 | 도구 호출 응답과 어댑터 호환성 | 경로 지원을 검증하세요. 거부된 도구 호출과 승인 프롬프트를 구분하세요. | 짧은 텍스트 요청과 실패한 도구 작업을 비교하고 오류를 보관하세요. |
| 명령이 승인 대기 상태 | 대화형 세션과 권한 설정 | 의도된 작업을 검토하고 승인하세요. 대기 요청을 API 장애로 간주하지 마세요. | 대화형 세션을 사용하고, 요청된 작업과 승인 결과를 기록하세요. |
| 429 또는 일시적 서버 오류 | 오류 세부 사항과 사용량 제한 | 요청 동시성을 줄이고, 지속적인 재시도 대신 재시도 지침을 따르세요. | HTTP 상태와 재시도 지침을 보관하고 동시성을 줄이세요. |
이슈를 공유할 때는 OpenCode 버전, 운영 체제, 모델 ID, 엔드포인트 경로, 마스킹된 오류 텍스트를 포함하세요. API 키와 비공개 리포지토리 내용은 제외하세요. 실패를 재현하는 최소 요청을 유지해 구성과 도구 실패를 분리해 조사할 수 있게 하세요.
FAQ
왜 OpenCode가 새 터미널에서 내 CometAPI 키를 잃어버리나요?
위의 export 및 PowerShell 명령은 현재 세션과 그 하위 프로세스에 대해 환경 변수를 설정합니다. 별도로 열린 터미널이나 이미 실행 중인 에디터는 이를 상속하지 않을 수 있습니다. OpenCode를 시작하는 환경에 키를 설정하고 해당 프로세스를 재시작하세요. 지속적 설정이 필요하면 리포지토리 파일에 비밀을 포함하지 말고 환경의 자격 증명 관리 기능을 사용하세요.
OpenCode가 .env 파일에서 COMETAPI_KEY를 자동으로 로드하나요?
{env:COMETAPI_KEY} 표현식은 프로세스 환경을 읽습니다. .env 파일을 만든 것만으로 변수가 로드되는 것은 아닙니다. OpenCode를 시작하기 전에 셸 또는 명시적으로 구성된 환경 로더를 사용하세요. provider가 사용 불가하다고 가정하기보다 시작 프로세스에서 빈 값을 진단하세요.
전역 OpenCode 구성이 이 프로젝트 설정을 변경할 수 있나요?
OpenCode는 구성을 병합하며, 이전 파일을 모두 대체하지는 않습니다. 프로젝트 파일은 전역 파일과 겹치는 필드를 재정의하며, 관련 없는 전역 설정은 유지됩니다. 사용자 지정 OPENCODE_CONFIG 파일은 그 사이에 로드됩니다. 리포지토리별 동작이 다르다면, 로컬 파일이 유일한 입력이라고 가정하지 말고 이 소스들과 관리형/인라인 설정을 비교하세요.
모델 목록 새로 고침이 CometAPI 접근을 활성화하나요?
아니요. 모델 새로 고침 옵션은 models.dev 캐시를 업데이트할 뿐, 계정 접근을 부여하거나 엔드포인트가 모델 ID를 수용한다는 증거는 아닙니다. 수동 구성된 항목은 성공적인 요청 이전에도 표시될 수 있습니다. 실제 요청으로 경로를 확인하고, CometAPI 계정 설정에서 접근 제한을 확인하세요.
왜 curl은 동작하는데 OpenCode는 CometAPI를 호출하지 못하나요?
두 프로세스가 서로 다른 자격 증명을 로드했거나, 다른 모델 ID를 사용했거나, 서로 다른 요청 형식을 보낼 수 있습니다. 먼저 curl이 성공한 것과 동일한 터미널에서 짧은 텍스트 프롬프트를 다시 실행하세요. 그런 다음 provider base URL, 어댑터, 선택 모델을 비교하세요. 단순 텍스트가 동작하지만 에이전트 작업이 실패한다면, 도구 관련 오류를 별도로 보존하세요. HTTP 연결성만으로 도구 호환성이 입증되지는 않습니다.
결론
이제 하나의 opencode.json에 Claude, GPT, DeepSeek 예시를 갖추고, 공유 CometAPI 자격 증명과 활성 모델 전환 명령을 준비했습니다. 짧은 텍스트 요청으로 접근을 점검한 뒤, 별도의 디렉터리에서 동일한 파일 생성 작업을 실행해 코딩 워크플로를 검증하세요. 더 큰 리포지토리에 적용하기 전에 관찰된 결과와 환경 세부 정보를 함께 보관하세요.
