mirror of
https://github.com/tiennm99/litellm.git
synced 2026-07-11 13:04:17 +00:00
fix: align max_tokens with max_output_tokens for consistency (#18820)
* fix: align max_tokens with max_output_tokens for consistency Fixed inconsistent max_tokens definitions in model_prices_and_context_window.json. According to LiteLLM convention, max_tokens should equal max_output_tokens when available. Models fixed: - deepseek-chat: 131072 → 8192 (now equals max_output_tokens) - dashscope/qwen-flash: 1000000 → 32768 (now equals max_output_tokens) - databricks/databricks-gemma-3-12b: 128000 → 32000 (now equals max_output_tokens) This ensures consistency across all providers where max_tokens represents the maximum number of tokens that can be generated in the output. * fix: align max_tokens with max_output_tokens for 244 models - Fix 244 models where max_tokens != max_output_tokens - Add test to validate max_tokens consistency and prevent regressions According to model_prices_and_context_window.json spec: - max_tokens is a LEGACY parameter - Should always equal max_output_tokens when both are present This ensures consistency across all model definitions.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -749,6 +749,57 @@ def test_aaamodel_prices_and_context_window_json_is_valid():
|
||||
raise AssertionError(error_message)
|
||||
|
||||
|
||||
def test_max_tokens_consistency():
|
||||
"""
|
||||
Test that max_tokens == max_output_tokens for all models.
|
||||
|
||||
According to the spec in model_prices_and_context_window.json:
|
||||
- max_tokens is a LEGACY parameter
|
||||
- It should be set to max_output_tokens if the provider specifies it
|
||||
|
||||
This test ensures consistency across all model definitions.
|
||||
"""
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
# Load the model configuration
|
||||
config_path = Path(__file__).parent.parent.parent / "model_prices_and_context_window.json"
|
||||
with open(config_path, 'r') as f:
|
||||
models = json.load(f)
|
||||
|
||||
inconsistencies = []
|
||||
|
||||
for model_name, config in models.items():
|
||||
# Skip the sample_spec
|
||||
if model_name == "sample_spec":
|
||||
continue
|
||||
|
||||
# Check if both max_tokens and max_output_tokens exist
|
||||
if isinstance(config, dict):
|
||||
max_tokens = config.get('max_tokens')
|
||||
max_output_tokens = config.get('max_output_tokens')
|
||||
|
||||
# Only validate if both exist
|
||||
if max_tokens is not None and max_output_tokens is not None:
|
||||
if max_tokens != max_output_tokens:
|
||||
inconsistencies.append({
|
||||
'model': model_name,
|
||||
'max_tokens': max_tokens,
|
||||
'max_output_tokens': max_output_tokens
|
||||
})
|
||||
|
||||
if inconsistencies:
|
||||
error_msg = f"\n\n❌ Found {len(inconsistencies)} models with max_tokens != max_output_tokens:\n\n"
|
||||
for item in inconsistencies[:10]: # Show first 10
|
||||
error_msg += f" {item['model']}: max_tokens={item['max_tokens']}, max_output_tokens={item['max_output_tokens']}\n"
|
||||
|
||||
if len(inconsistencies) > 10:
|
||||
error_msg += f"\n ... and {len(inconsistencies) - 10} more\n"
|
||||
|
||||
error_msg += "\nTo fix these inconsistencies, run: poetry run python fix_max_tokens_inconsistencies.py"
|
||||
raise AssertionError(error_msg)
|
||||
|
||||
|
||||
def test_get_model_info_gemini():
|
||||
"""
|
||||
Tests if ALL gemini models have 'tpm' and 'rpm' in the model info
|
||||
|
||||
Reference in New Issue
Block a user