mirror of
https://github.com/imartinez/privateGPT.git
synced 2026-07-16 17:00:12 +00:00
fix: update claude api spec (#2246)
* feat: allow to update claude api spec automatically * feat: script to update sdk / openapi from claude * feat: add xhigh reasoning * feat: add mid system content block
This commit is contained in:
121
scripts/update_claude_specs.py
Normal file
121
scripts/update_claude_specs.py
Normal file
@@ -0,0 +1,121 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Keep Claude-related specs in sync: OpenAPI spec URL and anthropic SDK version."""
|
||||
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
import urllib.request
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).parent.parent
|
||||
|
||||
ANTHROPIC_STATS_URL = "https://raw.githubusercontent.com/anthropics/anthropic-sdk-typescript/main/.stats.yml"
|
||||
ANTHROPIC_PYPI_URL = "https://pypi.org/pypi/anthropic/json"
|
||||
|
||||
OPENAPI_TEST_FILE = ROOT / "tests/models/anthropic/test_openapi_schema.py"
|
||||
PYPROJECT_FILE = ROOT / "pyproject.toml"
|
||||
|
||||
|
||||
def fetch_openapi_spec_url() -> str:
|
||||
with urllib.request.urlopen(ANTHROPIC_STATS_URL, timeout=15) as resp:
|
||||
for line in resp.read().decode().splitlines():
|
||||
if line.startswith("openapi_spec_url:"):
|
||||
spec_url: str = line.split(":", 1)[1].strip()
|
||||
return spec_url
|
||||
raise RuntimeError(f"openapi_spec_url not found in {ANTHROPIC_STATS_URL}")
|
||||
|
||||
|
||||
def fetch_latest_anthropic_version() -> str:
|
||||
with urllib.request.urlopen(ANTHROPIC_PYPI_URL, timeout=15) as resp:
|
||||
version: str = json.loads(resp.read().decode())["info"]["version"]
|
||||
return version
|
||||
|
||||
|
||||
def current_openapi_spec_url() -> str:
|
||||
source = OPENAPI_TEST_FILE.read_text(encoding="utf-8")
|
||||
match = re.search(r'^OPENAPI_SPEC_URL\s*=\s*"([^"]*)"', source, re.MULTILINE)
|
||||
spec_url: str = match.group(1) if match else "<not found>"
|
||||
return spec_url
|
||||
|
||||
|
||||
def current_anthropic_version() -> str:
|
||||
source = PYPROJECT_FILE.read_text(encoding="utf-8")
|
||||
match = re.search(r'"anthropic>=([\d.]+)"', source)
|
||||
return match.group(1) if match else "<not found>"
|
||||
|
||||
|
||||
def update_openapi_spec_url(new_url: str) -> None:
|
||||
source = OPENAPI_TEST_FILE.read_text(encoding="utf-8")
|
||||
updated, count = re.subn(
|
||||
r'^(OPENAPI_SPEC_URL\s*=\s*")[^"]*(")',
|
||||
rf"\g<1>{new_url}\g<2>",
|
||||
source,
|
||||
flags=re.MULTILINE,
|
||||
)
|
||||
if count == 0:
|
||||
raise RuntimeError(
|
||||
f"OPENAPI_SPEC_URL assignment not found in {OPENAPI_TEST_FILE}"
|
||||
)
|
||||
OPENAPI_TEST_FILE.write_text(updated, encoding="utf-8")
|
||||
|
||||
|
||||
def update_anthropic_version(new_version: str) -> None:
|
||||
source = PYPROJECT_FILE.read_text(encoding="utf-8")
|
||||
updated, count = re.subn(
|
||||
r'"anthropic>=[\d.]+"',
|
||||
f'"anthropic>={new_version}"',
|
||||
source,
|
||||
)
|
||||
if count == 0:
|
||||
raise RuntimeError(f"anthropic dependency not found in {PYPROJECT_FILE}")
|
||||
PYPROJECT_FILE.write_text(updated, encoding="utf-8")
|
||||
|
||||
|
||||
def sync_lock_file() -> None:
|
||||
print("\nRunning uv lock ...")
|
||||
subprocess.run(["uv", "lock"], check=True, cwd=ROOT)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
changed = False
|
||||
|
||||
# --- OpenAPI spec URL ---
|
||||
print(f"Fetching OpenAPI spec URL from {ANTHROPIC_STATS_URL} ...")
|
||||
latest_url = fetch_openapi_spec_url()
|
||||
pinned_url = current_openapi_spec_url()
|
||||
|
||||
if pinned_url == latest_url:
|
||||
print(" OpenAPI spec URL already up to date.")
|
||||
else:
|
||||
rel = OPENAPI_TEST_FILE.relative_to(ROOT)
|
||||
print(f" Updating {rel}")
|
||||
print(f" {pinned_url}")
|
||||
print(f" -> {latest_url}")
|
||||
update_openapi_spec_url(latest_url)
|
||||
changed = True
|
||||
|
||||
# --- anthropic SDK version ---
|
||||
print(f"\nFetching latest anthropic version from {ANTHROPIC_PYPI_URL} ...")
|
||||
latest_version = fetch_latest_anthropic_version()
|
||||
pinned_version = current_anthropic_version()
|
||||
|
||||
if pinned_version == latest_version:
|
||||
print(f" anthropic already at {latest_version}.")
|
||||
else:
|
||||
print(f" Updating {PYPROJECT_FILE.name}")
|
||||
print(f" anthropic>={pinned_version}")
|
||||
print(f" -> anthropic>={latest_version}")
|
||||
update_anthropic_version(latest_version)
|
||||
changed = True
|
||||
|
||||
if not changed:
|
||||
print("\nAll specs up to date.")
|
||||
sys.exit(0)
|
||||
|
||||
sync_lock_file()
|
||||
print("Done.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user