Skip to main content

Model Registry

AI Supreme Council uses a community-maintained model registry to keep its list of available models up to date. The registry is a JSON file hosted on GitHub that the app fetches and caches locally.

How It Works

The registry file (registry/models.json) contains a structured list of providers, their models, pricing tiers, free profiles, and preset council configurations. On page load, the AIS.Registry module fetches the latest registry data and caches it locally. The cache uses a stale-while-revalidate pattern with a 24-hour TTL -- the app serves the cached version immediately and fetches a fresh copy in the background.

If the fetch fails (offline, GitHub down), the app falls back to the locally cached copy. This ensures the model list is always available even without network connectivity.

Registry Structure

The models.json file has six top-level sections:

{
"version": 14,
"updated": "2026-02-15T12:00:00Z",
"meta": { ... },
"providers": { ... },
"tiers": { ... },
"models": [ ... ],
"freeProfiles": [ ... ],
"presetCouncils": [ ... ]
}
SectionDescription
versionInteger version number, incremented on each update
updatedISO 8601 timestamp of the last update
metaMetadata: source URL, contributing guide, refresh interval, leaderboard info
providersProvider definitions (API endpoints, auth config, features)
tiersPricing tier definitions (free, paid, enterprise)
modelsArray of all model entries with capabilities and pricing
freeProfilesPre-built profiles for free models (used in the wizard)
presetCouncilsPre-configured council templates (used in the wizard cluster path)

Provider Schema

Each provider entry defines how to connect to that provider's API:

{
"anthropic": {
"name": "Anthropic",
"description": "Claude models",
"keyPlaceholder": "sk-ant-...",
"order": 1,
"arenaScore": 1506,
"baseUrl": "https://api.anthropic.com/v1/messages",
"authType": "header",
"authHeader": "x-api-key",
"keyUrl": "https://console.anthropic.com/settings/keys",
"format": "anthropic",
"features": ["vision", "tools", "streaming", "reasoning"],
"freeTier": null
}
}
FieldRequiredDescription
nameYesDisplay name for the provider
baseUrlYesAPI endpoint URL
authTypeYesAuthentication method: bearer, header, query, or none
formatYesAPI format: anthropic, openai, or gemini
descriptionNoShort description shown in the UI
keyPlaceholderNoPlaceholder text for the API key input
orderNoDisplay order in the provider list
arenaScoreNoArena ELO score for model ranking
keyUrlNoURL to the provider's API key management page
featuresNoArray of supported features (vision, tools, streaming, reasoning, json_mode)
freeTierNoDescription of free tier availability, or null if no free tier
extraHeadersNoAdditional headers to send with every request
localNotrue for local providers like Ollama
detectUrlNoURL to detect available local models

Model Schema

Each model entry defines a specific model's capabilities and pricing:

{
"id": "claude-opus-4-6",
"name": "Claude Opus 4.6",
"provider": "anthropic",
"context": 1000000,
"maxOutput": 128000,
"pricing": {
"input": 5.0,
"output": 25.0,
"cachedInput": 0.5
},
"capabilities": ["vision", "tools", "streaming", "code"],
"tier": "paid",
"default": true
}
FieldRequiredTypeDescription
idYesstringUnique model identifier (sent to the API)
nameYesstringHuman-readable display name
providerYesstringProvider ID (must exist in providers object)
contextYesintegerContext window size in tokens
maxOutputYesintegerMaximum output tokens
pricingYesobject{input, output, cachedInput?} in $/MTok
capabilitiesYesarrayAllowed values: vision, tools, streaming, json_mode, reasoning, code
tierYesstringOne of: free, paid, enterprise
defaultNobooleanIf true, this model is pre-selected for its provider

Free Profiles

The freeProfiles array contains pre-built single-model profiles for free models. These appear in the wizard's model selection step, allowing new users to get started without a credit card.

{
"name": "Gemini 3 Flash",
"icon": "⚡",
"provider": "gemini",
"model": "gemini-3-flash-preview",
"description": "Fast Gemini 3, 1M context. Vision + tools.",
"tags": ["fast", "vision", "tools", "code"],
"recommended": true,
"arenaScore": 1473
}

Free profiles are sorted by arenaScore in the wizard to show the highest-quality free models first. Profiles with recommended: true are highlighted.

Current free model sources include:

  • Google Gemini free tier (Gemini 3 Flash, Gemini 2.5 Flash, Gemini 2.5 Flash-Lite)
  • OpenRouter free models (DeepSeek R1, Qwen 3 Coder, GLM 4.5 Air, Mistral Small, GPT-OSS 120B, and others)

Preset Councils

The presetCouncils array contains pre-configured multi-model council templates. These appear in the wizard's cluster path, allowing users to create councils with a single click.

{
"name": "Research Team",
"icon": "🔬",
"description": "Top arena models from 5 providers...",
"simpleDescription": "Your dream team of AI brains...",
"style": "research",
"chairman": 0,
"privacy": "private",
"members": [
{ "provider": "anthropic", "model": "claude-opus-4-6" },
{ "provider": "gemini", "model": "gemini-3-pro-preview" },
{ "provider": "xai", "model": "grok-4-1-fast-reasoning" }
],
"recommended": true
}
FieldDescription
nameCouncil display name
iconEmoji icon
descriptionTechnical description (shown to advanced users)
simpleDescriptionPlain-language description (shown in simple mode)
styleCouncil deliberation style (research, compare, arena, moa, router, debate, consensus)
chairmanIndex of the chairman member (0-based), or null for no chairman
membersArray of {provider, model} member definitions (minimum 2)
recommendedIf true, highlighted in the wizard

Contributing Models

To add or update models in the registry:

  1. Fork the repository on GitHub
  2. Edit registry/models.json with your changes
  3. Run the validation script: python3 registry/validate.py
  4. Submit a pull request

Validation Rules

The validation script (registry/validate.py) enforces these rules:

Provider validation:

  • All required fields present: name, baseUrl, authType, format

Model validation:

  • All required fields present: id, name, provider, context, maxOutput, pricing, capabilities, tier
  • No duplicate model IDs across the entire registry
  • Provider reference must exist in the providers object
  • Tier must be one of: free, paid, enterprise
  • Capabilities must be from the allowed set: vision, tools, streaming, json_mode, reasoning, code
  • Pricing values must be non-negative
  • Context and maxOutput must be positive integers

Preset council validation:

  • Required fields: name, style, members
  • Style must be valid: research, compare, arena, moa, router, debate, consensus
  • Members must be an array with at least 2 entries
  • Each member must have provider and model fields
  • Chairman index (if set) must be within the members array bounds

Running Validation

# Validate models (default)
python3 registry/validate.py

# Validate with a specific file path
python3 registry/validate.py /path/to/models.json

# Validate packages registry
python3 registry/validate.py packages

# Validate a manifest file
python3 registry/validate.py manifest path/to/manifest.json

# Validate themes registry
python3 registry/validate.py themes

# Validate templates registry
python3 registry/validate.py templates

The script exits with code 0 on success and code 1 on failure, with detailed error messages for each validation failure.

Auto-Refresh

The registry refreshes automatically when the page loads. The meta.refreshInterval field (default: 86400 seconds = 24 hours) controls how long the cached data is considered fresh. You can force a refresh by clearing the app's cached data in Settings > Privacy.

Registry Hosting

The registry is served from GitHub as a static JSON file. This means:

  • No server-side logic required
  • Changes go live as soon as the PR is merged
  • The file is CDN-cached for fast global access
  • The app falls back gracefully if GitHub is unreachable
  • Multiple CDN layers ensure global availability
info

The registry is a bootstrap mechanism. At planetary scale (see the project's architecture goals), the registry propagates through a DHT (Distributed Hash Table) and gossip protocol. The GitHub-hosted JSON serves as the initial bootstrap and fallback.