GitHub Copilot
GitHub Copilot
이 문서에서는 pydantic-ai에서 GitHubCopilotModel을 설치하고 설정하는 방법을 알려드려요. GitHub Copilot은 Anthropic, OpenAI, Google, xAI, MoonshotAI 모델을 서빙하며, 게시된 모델별 토큰 요율로 Copilot 구독에서 끌어오는 AI 크레딧으로 측정돼요. Pydantic AI는 Copilot의 OpenAI 호환 Chat Completions API와 대화합니다.
출처: 문서
본문
GitHub Copilot은 Anthropic, OpenAI, Google, xAI, MoonshotAI 모델을 서빙하며, 게시된 모델별 토큰 요율로 Copilot 구독에서 끌어오는 AI 크레딧으로 측정돼요. Pydantic AI는 Copilot의 OpenAI 호환 Chat Completions API와 대화하는데, 이 API는 Copilot이 거기 노출하는 id만 도달해요. 작성 시점에 Claude, Gemini, Kimi id와 gpt-5.4, 그리고 모든 xAI Grok id와 대부분의 다른 GPT id는 Responses API에서만 서빙되어 Pydantic AI가 그것을 말할 때까지 도달 불가예요. 모델 id는 플랜에 따라 달라져요를 확인하세요.
이것은 GitHub Models가 아니에요
GitHubProvider와 github: 접두사는 2026년 7월에 폐지된 GitHub Models를 서빙했어요. Copilot은 다른 호스트, 자체 모델 id, 자체 자격 증명을 가진 다른 API예요.
Install
GitHubCopilotModel을 사용하려면 pydantic-ai를 설치하거나, openai 옵션 그룹과 함께 pydantic-ai-slim을 설치해야 해요:
Terminal
pip install "pydantic-ai-slim[openai]"
Terminal
uv add "pydantic-ai-slim[openai]"
Configuration
Copilot은 bearer 토큰으로 인증해요. OAuth 사용자 토큰 — gh auth token이 출력하는 것, 또는 copilot login 후 Copilot CLI가 저장하는 것 — 은 인퍼런스 API에 직접 동작해요. 토큰 교환이 필요 없어요.
Token type
Status
OAuth user token (gho_)
동작.
Copilot API token (tid=...)
하나를 발급하는 플랜에서 동작.
Copilot Requests를 가진 Fine-grained PAT (github_pat_)
GitHub의 Copilot SDK 문서에 나열되지만, 우리가 테스트한 Individual 플랜에서 401 unauthorized로 거부됨.
Classic PAT (ghp_)
GitHub가 지원하지 않음.
Environment variable
Terminal
export GITHUB_COPILOT_API_KEY='your-copilot-token'
GITHUB_COPILOT_API_TOKEN과 COPILOT_GITHUB_TOKEN은 GitHub의 자체 도구가 그 이름을 사용하므로 폴백으로 읽혀요. 범용 GITHUB_TOKEN, GH_TOKEN, GITHUB_API_KEY 변수는 의도적으로 읽지 않아요. GitHub API용으로 설정한 토큰이 절대 Copilot에 전송되지 않도록요.
그 다음 이름으로 GitHubCopilotModel을 사용할 수 있어요:
from pydantic_ai import Agent
agent = Agent('github-copilot:claude-haiku-4.5')
...
또는 모델 이름만으로 모델을 직접 초기화할 수도 있어요:
from pydantic_ai import Agent
from pydantic_ai.models.github_copilot import GitHubCopilotModel
model = GitHubCopilotModel('gpt-5.4')
agent = Agent(model)
...
또는 GitHubCopilotProvider를 통해 토큰을 명시적으로 전달하세요:
from pydantic_ai import Agent
from pydantic_ai.models.github_copilot import GitHubCopilotModel
from pydantic_ai.providers.github_copilot import GitHubCopilotProvider
model = GitHubCopilotModel(
'claude-haiku-4.5',
provider=GitHubCopilotProvider(api_key='your-copilot-token'),
)
agent = Agent(model)
...
Model ids depend on your plan
Copilot의 카탈로그는 구독에 따라 다르고 자주 바뀌므로, Pydantic AI는 고정 목록을 제공하지 않아요 — 어떤 id든 받아들여지고 점을 포함해 정확히 쓴 그대로 Copilot에 전송돼요. 자체 플랜이 서빙하는 id를 나열하려면:
Terminal
curl -H "Authorization: Bearer $GITHU..._KEY" \
-H "Copilot-Integration-Id: vscode-chat" \
https://api.githubcopilot.com/models
각 항목의 supported_endpoints는 어떤 API가 그것을 서빙하는지 말해요. Pydantic AI는 그 목록에 /chat/completions가 필요해요.
목록은 Copilot-Integration-Id 헤더에 의존하며, GitHubCopilotProvider가 모든 요청에 그것을 전송하므로 Authorization만 있는 호출은 프로바이더가 실제로 도달할 수 있는 것보다 적은 id를 반환해요 — 작성 시점의 Gemini id.
두 개의 400 응답이 id가 왜 안 됐는지 말해줘요:
model_not_supported-- 플랜에 그 모델이 없음. 예를 들어claude-sonnet-4.5는 Individual 플랜에서 사용 불가.unsupported_api_for_model-- 모델은 존재하지만 Chat Completions에서 서빙되지 않음. Pydantic AI는 아직 Copilot의 Responses API를 말하지 않으므로, 이러한 id(작성 시점의 모든 xAI Grok id)는 지금으로서 도달 불가.
Thinking
Chat Completions에서 도달 가능한 추론 모델(작성 시점의 gpt-5.4, claude-sonnet-5, gemini-3.8-flash 등)은 통합된 thinking 설정을 받아요:
from pydantic_ai import Agent
from pydantic_ai.settings import ModelSettings
agent = Agent(
'github-copilot:gpt-5.4',
model_settings=ModelSettings(thinking='high'),
)
...
어떤 id가 추론을 표면화하는지는 계열에 따라 달라요. Copilot은 OpenAI 호환 프로바이더가 보통 사용하는 두 필드 이름 중 어느 쪽 대신 reasoning_text 필드로 Anthropic과 Google 추론을 반환하며, Pydantic AI는 claude-와 gemini- id에 대해 그 필드를 알므로, 그들의 추론은 스트리밍과 비스트리밍 경로 둘 다에서 ThinkingPart로 도착하고 이후 턴에서 같은 필드로 돌아가요. Copilot은 그것과 함께 reasoning_opaque 서명을 반환하며, Pydantic AI는 이를 나르지 않아요. Copilot은 그것 없이 후속 턴을 받아들여요. OpenAI와 MoonshotAI id는 다른 경우예요. gpt-5.4와 kimi-k3는 당신이 주는 effort에서 추론하고(kimi-k3는 추론 토큰을 청구), Copilot은 추론 텍스트를 전혀 반환하지 않으므로, 그 id는 절대 ThinkingPart를 만들지 않아요.
Claude id는 또한 적응형으로 추론해요. 설정한 effort는 지침이 아니라 상한이므로, Copilot은 어떤 effort에서든 쉬운 질문에 추론 없이 답할 수 있고, ThinkingPart가 모든 응답에 보장되지는 않아요.
thinking은 reasoning_effort로 전달되고 Copilot이 모델별로 받아들이는 것을 결정해요. id가 나열하지 않는 수준을 요청하면 그것이 나열하는 수준을 이름짓는 400 invalid_reasoning_effort로 답해요. 알 가치가 있는 세 가지 경우:
thinking=False는reasoning_effort='none'이 되며, 일부 id만 제공해요.claude-와gemini-id는low부터 나열하고none은 없으므로, 조용히 아무것도 안 하는 대신 거기서400해요.thinking=True는reasoning_effort='medium'이 되며,kimi-k3는 그것을 나열하지 않아요(수준은low,high,max), 그러니 그것에는 명시적 수준을 고르세요.claude-haiku-4.5처럼 항목에reasoning_effort키가 전혀 없는 id는 모든 값을 거부해요.
Custom endpoints
Copilot Enterprise 호스트, GitHub Enterprise Server, 로컬 프록시는 다른 호스트에서 같은 API를 말해요. base_url로, 또는 GITHUB_COPILOT_BASE_URL, COPILOT_API_URL, GITHUB_COPILOT_API_BASE 환경 변수로 프로바이더를 그 중 하나에 지정하세요:
from pydantic_ai import Agent
from pydantic_ai.models.github_copilot import GitHubCopilotModel
from pydantic_ai.providers.github_copilot import GitHubCopilotProvider
model = GitHubCopilotModel(
'claude-haiku-4.5',
provider=GitHubCopilotProvider(
api_key='your-copilot-token',
base_url='https://copilot.example.com',
),
)
agent = Agent(model)
...
Not supported
Copilot의 Responses(/responses)와 Messages(/v1/messages) API와 realtime은 구현되지 않아요. 임베딩도 마찬가지지만, github-copilot이 OpenAI-chat 호환 프로바이더로 간주되므로 Embedder('github-copilot:...')는 여전히 예외를 발생시키는 대신 OpenAIEmbeddingModel을 구축해요 — 게이트웨이의 /embeddings를 가리키며, 그것은 400으로 답해요. 비용과 컨텍스트 창 데이터도 사용 불가해요. genai-prices는 genai-prices#683에서 github-copilot 항목을 얻었지만, 아직 그것을 지니는 출시된 릴리스는 없어요.
Copilot의 Claude id는 Anthropic의 sampling 제한을 상속해요. Opus 4.7, Opus 4.8, Opus 5, Sonnet 5, Fable 5, Mythos 5에서 — 그리고 그 중 하나로 시작하는 이름의 어떤 id에서 — temperature와 top_p는 전달되는 대신 조용히 요청에서 버려져요. Anthropic API를 통해 같은 모델에 도달할 때와 정확히 똑같아요. 그 두 키만 그렇고, top_k는 버릴 Chat Completions 동등물이 없으며, extra_body로 전달하는 temperature나 어떤 openai_* 설정은 여전히 전송돼요. 다른 모든 id — claude-haiku-4.5 포함 — 는 둘 다 변경 없이 전달해요.