Skip to content

Commit 12bef8f

Browse files
Merge pull request #13691 from timelfrink/feat/github-copilot-thinking-reasoning-support
feat: Add thinking and reasoning_effort parameter support for GitHub Copilot provider
2 parents f01c7d1 + a913ecf commit 12bef8f

File tree

4 files changed

+78
-5
lines changed

4 files changed

+78
-5
lines changed

litellm/litellm_core_utils/get_supported_openai_params.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,10 +268,9 @@ def get_supported_openai_params( # noqa: PLR0915
268268
from litellm.llms.elevenlabs.audio_transcription.transformation import (
269269
ElevenLabsAudioTranscriptionConfig,
270270
)
271-
return (
272-
ElevenLabsAudioTranscriptionConfig().get_supported_openai_params(
273-
model=model
274-
)
271+
272+
return ElevenLabsAudioTranscriptionConfig().get_supported_openai_params(
273+
model=model
275274
)
276275
elif custom_llm_provider in litellm._custom_providers:
277276
if request_type == "chat_completion":

litellm/llms/github_copilot/chat/transformation.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,30 @@ def validate_environment(
8181

8282
return validated_headers
8383

84+
def get_supported_openai_params(self, model: str) -> list:
85+
"""
86+
Get supported OpenAI parameters for GitHub Copilot.
87+
88+
For Claude models that support extended thinking (Claude 4 family and Claude 3-7), includes thinking and reasoning_effort parameters.
89+
For other models, returns standard OpenAI parameters (which may include reasoning_effort for o-series models).
90+
"""
91+
from litellm.utils import supports_reasoning
92+
93+
# Get base OpenAI parameters
94+
base_params = super().get_supported_openai_params(model)
95+
96+
# Add Claude-specific parameters for models that support extended thinking
97+
if "claude" in model.lower() and supports_reasoning(
98+
model=model.lower(),
99+
):
100+
if "thinking" not in base_params:
101+
base_params.append("thinking")
102+
# reasoning_effort is not included by parent for Claude models, so add it
103+
if "reasoning_effort" not in base_params:
104+
base_params.append("reasoning_effort")
105+
106+
return base_params
107+
84108
def _determine_initiator(self, messages: List[AllMessageValues]) -> str:
85109
"""
86110
Determine if request is user or agent initiated based on message roles.

litellm/llms/github_copilot/common_utils.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ def __init__(
2828
)
2929

3030

31-
3231
class GetDeviceCodeError(GithubCopilotError):
3332
pass
3433

tests/test_litellm/llms/github_copilot/test_github_copilot_transformation.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,57 @@ def test_x_initiator_header_system_only_messages():
364364
assert headers["X-Initiator"] == "user"
365365

366366

367+
def test_get_supported_openai_params_claude_model():
368+
"""Test that Claude models with extended thinking support have thinking and reasoning parameters."""
369+
config = GithubCopilotConfig()
370+
371+
# Test Claude 4 model supports thinking and reasoning_effort parameters
372+
supported_params = config.get_supported_openai_params("claude-sonnet-4-20250514")
373+
assert "thinking" in supported_params
374+
assert "reasoning_effort" in supported_params
375+
376+
# Test Claude 3-7 model supports thinking and reasoning_effort parameters
377+
supported_params_claude37 = config.get_supported_openai_params("claude-3-7-sonnet-20250219")
378+
assert "thinking" in supported_params_claude37
379+
assert "reasoning_effort" in supported_params_claude37
380+
381+
# Test Claude 3.5 model does NOT support thinking parameters (no extended thinking)
382+
supported_params_claude35 = config.get_supported_openai_params("claude-3.5-sonnet")
383+
assert "thinking" not in supported_params_claude35
384+
assert "reasoning_effort" not in supported_params_claude35
385+
386+
# Test non-Claude model doesn't include thinking parameters but may include reasoning_effort
387+
supported_params_gpt = config.get_supported_openai_params("gpt-4o")
388+
assert "thinking" not in supported_params_gpt
389+
# gpt-4o should NOT have reasoning_effort (not a reasoning model)
390+
assert "reasoning_effort" not in supported_params_gpt
391+
392+
# Test O-series reasoning models include reasoning_effort but not thinking
393+
supported_params_o3 = config.get_supported_openai_params("o3-mini")
394+
assert "thinking" not in supported_params_o3
395+
# o3-mini should have reasoning_effort (it's an O-series reasoning model)
396+
assert "reasoning_effort" in supported_params_o3
397+
398+
399+
def test_get_supported_openai_params_case_insensitive():
400+
"""Test that Claude model detection is case-insensitive for models with extended thinking."""
401+
config = GithubCopilotConfig()
402+
403+
# Test uppercase Claude 4 model with full model name
404+
supported_params_upper = config.get_supported_openai_params("CLAUDE-SONNET-4-20250514")
405+
assert "thinking" in supported_params_upper
406+
assert "reasoning_effort" in supported_params_upper
407+
408+
# Test mixed case Claude 3-7 model (has extended thinking) with full model name
409+
supported_params_mixed = config.get_supported_openai_params("Claude-3-7-Sonnet-20250219")
410+
assert "thinking" in supported_params_mixed
411+
assert "reasoning_effort" in supported_params_mixed
412+
413+
# Test that Claude 3.5 models don't have thinking support (case insensitive)
414+
supported_params_35 = config.get_supported_openai_params("CLAUDE-3.5-SONNET")
415+
assert "thinking" not in supported_params_35
416+
assert "reasoning_effort" not in supported_params_35
417+
367418
def test_copilot_vision_request_header_with_image():
368419
"""Test that Copilot-Vision-Request header is added when messages contain images"""
369420
config = GithubCopilotConfig()

0 commit comments

Comments
 (0)