Files
litellm/scripts/update_readme_providers_table.py
Ishaan Jaff 0428229032 [Docs] readme fixes add supported providers (#16109)
* add provider test

* docs readme.md

* docs providers

* order providers

* test_providers_alphabetically_ordered

* docs endpoint

* fix config

* add ENDPOINT_COLUMNS

* add provider endpoints

* docs fix
2025-10-30 17:23:20 -07:00

148 lines
4.4 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
Script to update the README.md providers table from provider_endpoints_support.json
"""
import json
import re
from pathlib import Path
# Define paths
REPO_ROOT = Path(__file__).parent.parent
JSON_PATH = REPO_ROOT / "provider_endpoints_support.json"
README_PATH = REPO_ROOT / "README.md"
# Endpoint column headers
ENDPOINT_COLUMNS = [
("/chat/completions", "chat_completions"),
("/messages", "messages"),
("/responses", "responses"),
("/embeddings", "embeddings"),
("/image/generations", "image_generations"),
("/audio/transcriptions", "audio_transcriptions"),
("/audio/speech", "audio_speech"),
("/moderations", "moderations"),
("/batches", "batches"),
("/rerank", "rerank"),
]
def load_providers_data():
"""Load provider data from JSON file"""
with open(JSON_PATH, 'r') as f:
data = json.load(f)
# Handle both old and new format
if "providers" in data:
return data["providers"]
return data
def generate_markdown_table(providers_data):
"""Generate markdown table from providers data"""
# Sort providers alphabetically by display name
sorted_providers = sorted(
providers_data.items(),
key=lambda x: x[1]['display_name'].lower()
)
# Generate header
header_cols = ["Provider"] + [col[0] for col in ENDPOINT_COLUMNS]
header = "| " + " | ".join(header_cols) + " |"
separator = "|" + "|".join(["-" * (len(col) + 2) for col in header_cols]) + "|"
# Generate rows
rows = []
for slug, data in sorted_providers:
display_name = data['display_name']
url = data['url']
# Build row
row_parts = [f"[{display_name}]({url})"]
for _, endpoint_key in ENDPOINT_COLUMNS:
supported = data['endpoints'].get(endpoint_key, False)
row_parts.append("" if supported else "")
row = "| " + " | ".join(row_parts) + " |"
rows.append(row)
# Combine all parts
table_lines = [
"<!-- AUTO-GENERATED TABLE - DO NOT EDIT MANUALLY -->",
"<!-- Edit provider_endpoints_support.json and run scripts/update_readme_providers_table.py -->",
"",
header,
separator
] + rows + [
"<!-- END AUTO-GENERATED TABLE -->"
]
return "\n".join(table_lines)
def update_readme(table_markdown):
"""Update README.md with new table"""
with open(README_PATH, 'r') as f:
content = f.read()
print(f" Original README length: {len(content)} bytes")
# Find the table section
# Look for the AUTO-GENERATED comment or the header, and replace until Read the Docs
pattern = r"(## Supported Providers.*?\n\n)(?:<!-- AUTO-GENERATED TABLE.*?<!-- END AUTO-GENERATED TABLE -->|.*?)(\n\n\[\*\*Read the Docs\*\*\])"
# Test if pattern matches
match = re.search(pattern, content, flags=re.DOTALL)
if not match:
print("❌ Pattern did not match in README.md")
return False
print(f" Pattern matched, replacing table...")
def replacer(match):
return match.group(1) + table_markdown + match.group(2)
new_content = re.sub(pattern, replacer, content, flags=re.DOTALL)
print(f" New README length: {len(new_content)} bytes")
if new_content == content:
print(" Table is already up-to-date, no changes needed")
return True # Not an error - table is already correct
with open(README_PATH, 'w') as f:
f.write(new_content)
print(" ✓ README.md has been updated")
return True
def main():
"""Main function"""
print("Loading provider data from provider_endpoints_support.json...")
providers_data = load_providers_data()
print(f"✓ Loaded {len(providers_data)} providers")
print("\nGenerating markdown table...")
table_markdown = generate_markdown_table(providers_data)
print(f"✓ Generated table with {len(providers_data)} rows")
print("\nUpdating README.md...")
if update_readme(table_markdown):
print("✓ Successfully updated README.md")
print("\n📝 Please review the changes and commit both files:")
print(" - provider_endpoints_support.json")
print(" - README.md")
else:
print("❌ Failed to update README.md")
return 1
return 0
if __name__ == "__main__":
exit(main())