Files
ai_ops2/.app_factory/claude_home/.claude/plans/gleaming-dreaming-bubble.md
2026-02-25 23:49:54 -05:00

3.0 KiB

OpenRouter Model Sync Script

Context

User wants a Python script that fetches all available models from the OpenRouter API (GET https://openrouter.ai/api/v1/models) and generates:

  1. ~/.litellm/config.yaml — LiteLLM proxy config with all matching models
  2. ~/.env_keys.example — single OPENROUTER_API_KEY entry

Filtering is controlled by a YAML config file with provider-level and model-name-pattern include/exclude rules. The script overwrites (not merges) the target files.

Files to Create

1. ~/.litellm/openrouter_sync.yaml — Filter config (with defaults/example)

# Which providers/models to include or exclude from OpenRouter.
# Filters are evaluated in order: include first, then exclude.
# Glob patterns supported (fnmatch-style).

filters:
  providers:
    include: []       # empty = all providers included
    exclude: []       # e.g. ["openrouter", "auto"]

  models:
    include: []       # empty = all models included (after provider filter)
    exclude: []       # e.g. ["*:free", "*-preview", "*/old-*"]

# Output paths (defaults shown)
output:
  config_yaml: "~/.litellm/config.yaml"
  env_keys: "~/.env_keys.example"

Filter logic:

  • providers.include: if non-empty, only models from these providers are kept. Provider = first path segment of model id (e.g. google from google/gemini-2.0-flash).
  • providers.exclude: remove models from these providers (applied after include).
  • models.include: if non-empty, only model ids matching any of these glob patterns are kept.
  • models.exclude: remove model ids matching any of these glob patterns.

2. ~/.litellm/sync_openrouter.py — Main script

Logic:

  1. Load filter config from ~/.litellm/openrouter_sync.yaml (create default if missing).
  2. GET https://openrouter.ai/api/v1/models — fetch all models.
  3. Apply provider include/exclude filters.
  4. Apply model name include/exclude filters (fnmatch glob).
  5. Build LiteLLM model_list entries:
    model_list:
      - model_name: google/gemini-2.0-flash    # the OpenRouter model id
        litellm_params:
          model: openrouter/google/gemini-2.0-flash
          api_key: os.environ/OPENROUTER_API_KEY
    
  6. Write config.yaml (overwrite).
  7. Write .env_keys.example with single line: export OPENROUTER_API_KEY="sk-or-REPLACE_ME".
  8. Print summary: total models fetched, filtered count, written count.

Dependencies: requests, pyyaml (both common; script will check and error clearly if missing).

No external packages beyond stdlib+requests+pyyaml. Uses fnmatch from stdlib for glob matching.

Verification

  1. Run python ~/.litellm/sync_openrouter.py with default (empty) filters — should populate config.yaml with all OpenRouter models.
  2. Edit openrouter_sync.yaml to exclude a provider, re-run, confirm those models are gone.
  3. Verify ~/.env_keys.example contains the OPENROUTER_API_KEY line.
  4. Validate generated config.yaml with python -c "import yaml; yaml.safe_load(open('config.yaml'))".