- Per-model max_input_tokens registry — the provider catalog previously advertised the same flat 262144 input-token floor for every provider. The gateway now records the authoritative input ceiling for its 23 binding model IDs (
_MODEL_INPUT_CAPS+get_model_max_input_tokens()infaigate/provider_catalog.py), grounded in the LiteLLM and OmniRoute provider registry reports. Routing (faigate/router.py) resolves the request model's real cap fromctx.model_requested, so an oversized input is rejected at the true model boundary instead of at the uniform floor.
- Routing fit and ranking now use the model-specific input cap (
get_model_max_input_tokens) in both the dimension-fit filter and the dimension-scoring path, overriding the provider-wide floor when the request model is known. _max_input_token_capdocstring corrected: the provider-wide 262144 value is documented as a floor, not a measured per-model truth. The 413 "advertised" threshold behavior is unchanged.
- Cohere provider — Command A/R via OpenAI-compat endpoint (
${COHERE_API_KEY}) - Mistral provider — Mistral Large via OpenAI-compat endpoint (
${MISTRAL_API_KEY}) - Catalog entries for Cohere (catalog.v1.json + provider_catalog.py)
- Removed duplicate
cohereblock in commented section (active block now lives with other API-key providers) last_revieweddate refreshed on Cohere and Mistral catalog entries
- Free provider catalog — 7 zero-cost providers: Pollinations (no API key required), Groq (ultra-fast LPU, 14.4K RPD), Cerebras (wafer-scale, 1M TPD), LongCat (Flash-Lite, 50M tokens/day), NVIDIA NIM (129 models, 40 RPM), Kiro (OAuth via AWS Builder ID, Sonnet 4.5 unlimited), Qoder (OAuth via Google, kimi-k2-thinking unlimited). All providers are commented out in
config.yamlby default; operators opt in. - Circuit breaker system (
faigate/breakers.py) — per-provider state machine (CLOSED → OPEN → HALF_OPEN) with configurable failure threshold, cooldown, and jitter. Integrated into the provider dispatch loop inmain.py. State is persisted in the metrics SQLite database (circuit_breakerstable). Auto-closes on successful HALF_OPEN probe. - Cockpit API endpoints (
/api/cockpit/*) — 6 endpoints:GET /health(provider health + circuit snapshot),GET /providers(full config view),GET /circuits(breaker state),POST /circuits/{provider}/reset(force-close),GET /stats(totals, 24h counts, top providers),GET /routes/log(recent request log). - Terminal cockpit TUI (
faigate/cockpit_tui.py) — Textual-based 4-tab dashboard (Dashboard, Providers, Circuits, Routes) with auto-refreshing data from/api/cockpit/*endpoints. Agent mode (faigate cockpit --agent <endpoint>) outputs JSON for script/programmatic consumption. - Circuit breaker response headers —
X-faigate-CircuitandX-faigate-Circuit-Provideradded to all chat completion responses for client-side circuit awareness.
- Routing mode updates —
coding-free,coding-fast, andecoprofiles now include free providers (pollinations, groq, cerebras) as backup chains. - Catalog freshness —
last_revieweddates refreshed across provider catalog entries. - Groq and Cerebras catalog entries migrated from
track: stabletotrack: freewith updated recommended models and notes.
- Duplicate
groqandcerebrasentries in_CATALOGmerged into single entries. catalog-stalealert false positives resolved by bumping review dates to 2026-05-04.- Mock
Namespaceintest_main_cliupdated for subparser compatibility. - External offerings/packages catalog env var isolation in test fixtures.
- Router now honours adaptive hard cooldowns (
faigate/router.py):_provider_matches_policyand_validate_healthpreviously consulted only the binaryprovider.health.healthyflag, which flips back toTrueafter a single successful health probe even if user-facing requests keep failing 4xx. The adaptiveRoutePressuretracker (faigate/adaptation.py) classified those persistent failures (auth-invalid,quota-exhausted,model-unavailable,endpoint-mismatch,rate-limited) and recorded a hard cooldown window, but the router never read it — so a structurally broken provider sitting at the top ofprefer_providerswould be re-selected on every request for the entire cooldown window, burning the user's request budget and producing the same 400 in a tight loop. New helper_provider_in_hard_cooldown(name, ctx)is now consulted in both the policy candidate filter and the fallback-chain iteration. Soft-degrade windows (transport-error,timeout) intentionally stay routable and continue to be handled via the additiveadaptation_penaltyin ranking. Direct/explicit-model routing (model: "openai-codex"etc.) is unaffected by design — explicit caller intent overrides the adaptive demotion. New unit tests intests/test_router_cooldown.pycover policy exclusion, recovery after cooldown expiry, and primary→fallback transition. Live regression seen on 2026-04-26: the chatgpt.com Codex backend rejectedgpt-5-codexfor ChatGPT Plus accounts with HTTP 400, and the unguarded prefer-providers path replayed the same broken provider 5+ times across multiple requests until the operator manually intervened. - Codex model-alias mapping is now ChatGPT-plan-tier-aware (
faigate/providers.py:_codex_effective_model): the previous mapping unconditionally translatedgpt-5.4→gpt-5-codexupstream. The chatgpt.com Codex backend gatesgpt-5-codexto Pro accounts only — Plus accounts must requestgpt-5-codex-mini, which produced the HTTP 400 noted above. The new helper_detect_codex_chatgpt_plan_tier()parseschatgpt_plan_typefrom the cached~/.codex/auth.jsonid_token JWT once per process lifetime and routesgpt-5.4to the variant the account can actually use (gpt-5-codexfor Pro,gpt-5-codex-minifor Plus, raw pass-through for unknown/free so the upstream rejects explicitly rather than us guessing wrong). - DeepSeek V4 multi-turn safeguard for openai-compat clients (
faigate/providers.py): DeepSeek V4 enabled thinking mode by default and madereasoning_contentround-trip on assistant messages mandatory when thinking is active. Any openai-compat client that does not trackreasoning_content(OpenCode, Codenomad, generic SDKs) breaks on every follow-up turn with HTTP 400"The reasoning_content in the thinking mode must be passed back to the API.". The send-path now inspects assistant messages and, when any assistant turn lacksreasoning_content, setsbody["thinking"] = {"type": "disabled"}(V4 expects an Anthropic-styleThinkingOptionsstruct, not a boolean —enable_thinking: falseis silently ignored). Single-turn reasoning still flows through unchanged. Provider/requestextra_bodyoverrides win because they merge in after the auto-set.
- DeepSeek V3 → V4 provider migration in the bundled
config.yaml: the legacydeepseek-chatanddeepseek-reasonerprovider blocks are replaced bydeepseek-v4-flash(workhorse, 1M ctx, $0.028/$0.14/$0.28 cache-hit/miss/output per 1M tokens) anddeepseek-v4-pro(premium reasoning, 1M ctx, $0.145/$1.74/$3.48). Lane canonical models becomedeepseek/v4-flashanddeepseek/v4-pro. All inbound references inprefer_providers,model_shortcuts,static_rules, and degrade chains have been swept. The DeepSeek API still exposes only these two model IDs (GET /v1/modelsconfirmed live on 2026-04-26). - Opencode/coding profile auto-router denies Codex providers: added
deny_providers: [openai-codex, openai-codex-mini, openai-codex-spark, openai-codex-{high,xhigh,low}, openai-codex-5.4-{low,medium,high,xhigh}]to theopencodeandcodingclient profiles. Explicit invocation viamodel_shortcutsstill works — this only stops the auto-router from picking codex as a long-context fallback when the preferred lanes overflow. With the per-account plan-tier fix above, the deny list is belt-and-suspenders, but it stays as defence-in-depth against future ChatGPT-side gating changes.
- Metadata catalog sync loop: the gateway now runs a lazy startup refresh plus an optional 24h background tick for the public/private metadata catalog. Failed syncs back off through 5m/15m/1h windows and persist sync state alongside the cached catalog.
- Catalog sync alerts: provider catalog, health, dashboard, and API surfaces now feed sync failures, stale caches, invalid payloads, and auth issues through the existing
build_catalog_alertsalert path. - Kilo Auto profile examples: the shipped config and OpenCode example now expose
kilo-auto/frontier,kilo-auto/balanced,kilo-auto/free, andkilo-auto/smallfor FAIGate-backed OpenCode/Codenomad use. - Fresh bundled catalog snapshot: refreshed the embedded metadata catalog with newly verified Opus 4.7, Haiku 4.5, GPT-5.5, DeepSeek V4, and OpenRouter Auto pricing metadata.
- Brand-first quota widget (
/dashboard/quotas): replaces the flat package list with one card per brand (Claude, DeepSeek, Kilo, …). Cards are sorted worst-alert first so the thing about to break is at the top. Each card stacks its sub-packages (session vs weekly, pay-as-you-go vs credits) with a pace marker on every window-based bar and an identity line (OAuth · claude-code,API key · ${KEY}) so you can tell which account feeds the meter. - Per-brand detail view (
/dashboard/quotas/<brand_slug>): a focused page that shows the same quota panel plus a 24h totals strip, clients-by-profile table, routes/lanes breakdown, and an hourly sparkline. Shares CSS variables with the overview so scanning between them needs no retraining. - Read-only brand endpoints (
/api/quotas/<slug>/clients,/routes,/analytics): the data feed behind the detail view. 404 on unknown brands (distinguishes "typo" from "no traffic yet"); analytics clampshours=1..168anddays=1..90to prevent URL-typo DB scans. Catalog surfacescatalog_taglineso the "Available to add" mini-block can show tier/price/quota shape at a glance. - Default landing view (
dashboard.quotas.default_viewinconfig.yaml): three options —overview(default),brand:<slug>,cockpit.GET /dashboard/quotashonors the setting via 302;?view=overviewis an always-available escape hatch. APin as Home/📌 Homebutton sits on every brand card and the detail-page header — one-click promotion, no modal. Writes go throughruamel.yamlround-trip so the 220+ operator comments in a realconfig.yamlsurvive a pin toggle (yaml.safe_dumpwould flatten them).GET/POST /api/dashboard/settingsdrives the widget and is available to external consumers. - Gate Bar 0.1 (macOS menubar companion) at
apps/gate-bar/: SwiftUIMenuBarExtraapp that reads the same/api/quotasfeed and showsfAI · 83%in the menubar (tightest window across all brands, colour-coded). Popover renders brand cards with the web widget's visual vocabulary; footer links toDashboard ↗(server-side redirect honoursdefault_view) andCockpit ↗. Preferences: gateway URL, Cockpit URL, refresh cadence (manual / 1 / 2 / 5 / 15 min). 13 Swift-Testing tests green on both Xcode.app and Command Line Tools viascripts/swift-test.sh. Read-only — every write path links out to the Operator Cockpit. Sparkle auto-update + notifications + code signing + Homebrew cask tracked for 0.2+ (apps/gate-bar/README.md).
- Quota widget groups by
provider_idfirst and gates on credential availability so brands without a resolvable API key / OAuth token land in the collapsed "Skipped" block instead of showing a perpetually-empty bar. QuotaStatuspayload carriesbrand,brand_slug,pace_delta, andidentityon every package (v1.3 catalog schema). Older v1.2 catalogs still decode through the brand-fallback table inquota_tracker.py.
- New runtime dependency:
ruamel.yaml>=0.18.6(already added torequirements.txt+pyproject.toml). Freshpip install faigateorbrew upgrade faigatepicks it up automatically. - The Gate Bar macOS app is a separate artifact. v0.1 is source-only — build it with
cd apps/gate-bar && ./scripts/install-local.shfor local testing. A notarized Homebrew cask ships with Gate Bar 0.2.
- Kilo balance polling switched to tRPC: the v2.2.0 implementation probed four REST URLs that Kilo never shipped (all 404/308). Replaced the probe-list with a single tRPC batch call to
https://app.kilo.ai/api/trpc/user.getCreditBlocks,kiloPass.getState,user.getAutoTopUpPaymentMethod?batch=1— the same endpoint CodexBar uses. Correctly sumsamount_mUsdacross credit blocks for total, usestotalBalance_mUsdfor remaining, and converts mUSD → USD. Live-verified against a real account: balance and block-level expiry now visible in/dashboard/quotas.
- Quota poller ignored concrete provider instances (
faigate/quota_poller.py): the dispatcher comparedprovider_idagainst literal"deepseek"/"kilocode", so catalog entries using the real router-facing IDs (deepseek-chat,deepseek-reasoner,kilo-sonnet,kilo-opus) silently fell through with "no balance fetcher for provider X". Introduced_provider_family()that collapses concrete IDs to balance-polling families, and updated both the fetcher dispatch and theenv_mapAPI-key lookup (now recognisesKILOCODE_API_KEYfor the kilo family).
- Slow
brew upgrade/pip installcaused by source-only pydantic-core:pyproject.tomlnow capspydantic,fastapi,httpx, anduvicornto version ranges that ship prebuilt wheels for all supported Python versions (3.10–3.13) and platforms (incl. macOS 15 Tahoe arm64). Without these caps pip could drift onto a bleeding-edge pydantic-core release with no wheel, forcing a 3–5 minute Rust/cargo source build during upgrade. This is a packaging-only change — no runtime behavior difference.
- Unified QuotaStatus abstraction (
faigate/quota_tracker.py): single view covering three package types —credits,rolling_window,daily— with EWMA burn rate, runway projection, and a five-level alert classifier (ok / watch / topup / use_or_lose / exhausted) - Background balance poller (
faigate/quota_poller.py): refreshes provider balances on a fast lane (15m) for packages within 14 days of expiry and a default 1h otherwise; covers DeepSeek via/user/balanceand probes Kilo across a candidate endpoint list; atomic JSON persistence; disabled by default (opt-in viaquota_poll.enabled) - Passive header-capture middleware (
faigate/quota_headers.py): dialect-aware parser forx-ratelimit-*(OpenAI / DeepSeek / OpenRouter) andanthropic-ratelimit-*families; hooked intoProviderBackend.completeso rolling-window packages get a free, near-realtime quota signal - Operator cockpit endpoints:
GET /api/quotasreturns the full QuotaStatus list plus latest header snapshots;GET /dashboard/quotasis a self-contained HTML page with color-coded progress bars sorted by alert urgency, polling every 60s - 7-provider catalog template at
docs/examples/fusionaize-metadata-repo/packages/catalog.v1.jsoncovering Kilo, DeepSeek, Blackbox, Anthropic Pro, OpenAI Plus, Qwen, and Gemini (free + Pro + CLI + Antigravity) with documented field semantics quota_pollconfig block with sane defaults (enabled: false,interval_seconds: 3600,fast_lane_interval_seconds: 900)
- Router package scoring now picks up
QuotaStatus.alert == "use_or_lose"and applies a +3 boost so expiring packages with real burn pressure decisively win ties over static-runway packages - Router now awards
rolling_windowanddailypackage types up to +5 points based on remaining ratio (parity withcredits, no provider class dominates solely by type) faigate-installrefuses to run alongside an existing Homebrew formula / service or a loaded LaunchAgent / systemd unit;--forceoverride available; defensive timestamped backups before any write
faigate-installSIGPIPE bug: install now uses explicit if/elif file-existence checks instead ofls | head -1, which underset -euo pipefailwould silently kill the script whenheadclosed the pipe
- Codex function tool calling: Codex-backed requests now forward OpenAI-style
toolsandtool_choiceto the ChatGPT Codex responses endpoint and translate returned function-call events back into OpenAI-compatibletool_calls, so tool-using clients like Codenomad can execute MCP-style tool flows instead of only seeing text or pseudo-JSON
- Codex tool transcript handling: assistant tool-call turns and
role: "tool"follow-up messages are now normalized before they are sent to the ChatGPT Codex responses endpoint, so Codex-backed clients such as Codenomad no longer fall back just because a tool result appears in the message history
- Codex OAuth provider startup gating: OAuth-backed Codex providers no longer get skipped during startup just because they do not use a static
api_key - Codex helper resolution in Brew/libexec installs:
faigate-authis now resolved robustly from the packaged runtime so Codex OAuth refresh works in Homebrew-managed installs - Codex responses endpoint handling: explicit empty
chat_pathvalues are preserved, so Codex requests stay onchatgpt.com/backend-api/codex/responsesinstead of drifting back to/chat/completions - Codex streaming compatibility:
stream=truenow uses the same responses adapter as non-stream requests and returns OpenAI-compatible SSE chunks without falling back to another provider
- Claude Code OAuth: reads Claude Code credentials from the macOS Keychain, refreshes expired tokens, and injects the required Anthropic OAuth headers on requests
- Antigravity + Gemini CLI OAuth: activates Google OAuth-backed
antigravityandgemini-cliproviders viacloudcode-pa.googleapis.com/v1internal
- Qwen Portal inference: corrected the portal base URL, request headers, and required system-message behavior for OAuth-backed inference
- Gate-namespaced Codex models: model IDs such as
faigate/openai-codex-5.4-mediumnow normalize correctly before provider routing - Local artifact hygiene:
.codenomad/andcatalog_output.jsonare no longer tracked release artifacts
- Codex
chat_pathbug:openai-compatbackend appended/chat/completionsto the Codex endpoint URL. Codex base_url IS the full endpoint; per-provider transport bindings now setchat_path: ""for allopenai-codex*providers faigate-authJSON output:OAuthBackend._run_helper()expects JSON on stdout; CLI was printing human-readable text →json.JSONDecodeErroron every Codex request. Fixed: token data now printed as JSON to stdout; status messages go to stderrmax_tokenslimit: OpenCode model limit was 32768, Codex endpoint maximum is 8192 →invalid_request_error. All Codex models now capped at 8192- Fallback to paid providers: Removed Sonnet/GPT-4o from Codex
degrade_tochains oauthbackend validation: Addedoauthto_SUPPORTED_BACKENDSinconfig.py
- GPT-5.4 reasoning effort control:
default_extra_bodymechanism inproviders.pyinjects provider-configured fields into every request. New providers:openai-codex-5.4-xhigh(extra_high),openai-codex-5.4-high(high),openai-codex-5.4-medium(medium),openai-codex-5.4-low(low) - Codex 5.3 reasoning variants:
openai-codex-xhigh→gpt-5.3-codex-xhigh,openai-codex-low→gpt-5.3-codex-low - All 20 Codex model variants in
_CANONICAL_MODEL_LANES(gpt-5.4, gpt-5.3-codex family, gpt-5.2, gpt-5.1 series, gpt-4.1, gpt-4o, o4-mini) - OAuth transport profile: Default transport binding for
oauthbackend withchat_path: "" - OpenCode model menu: 10 Codex model entries covering all reasoning levels
- OpenAI Codex OAuth: full ChatGPT OAuth implementation — reads
~/.codex/auth.json, Auth Code + PKCE login flow on port 1455, single-use refresh token handling, JWTexpclaim for expiry detection. Inference viachatgpt.com/backend-api/codex/responses. Run:faigate-auth openai-codex
registry.py: correctedopenai-codexbase URL tochatgpt.com/backend-api/codex/responses(was incorrectly set toapi.openai.com/v1)config.yaml: corrected OAuth endpoints toauth.openai.com/oauth/tokenand client ID toapp_EMoamEEZ73f0CkXaXp7hrann
- Shell parity & complete provider coverage: CLI deep-links,
--suggestand--linkflags, full LLMAIRouter and KiloCode model-level lane coverage (v2.0.0 baseline) - Qwen OAuth: production-ready integration via
qwen-codeCLI credentials; device-code flow, token refresh,coder-model+qwen-codealias - Antigravity OAuth: Authorization Code + PKCE flow; reads
~/.gemini/oauth_creds.json; calls Google Generative Language API directly (not through local gRPC proxy) - Google Antigravity provider: full registry, catalog, and lane-registry integration for
ag/model family (Claude Opus/Sonnet 4.6, Gemini 3.x variants) - CI Gate: single required status check consolidating test, lint, package, and forbid-artifacts; admin bypass disabled
- Auto-merge bot: PRs merge automatically once CI Gate passes (
gh pr merge --auto --squash) - pre-commit enforcement:
validate-configstep in CI;pre-commit installrequired in onboarding
- Antigravity
base_urlresolved togenerativelanguage.googleapis.com/v1beta/openai(was incorrect endpoint) forbid-artifactscheck consolidated intoci.yml(removed separaterepo-safety.yml)- Release title convention enforced in
notify-tapworkflow (fusionAIze Gate vX.Y.Z)
- OAuth wrapper for managed providers: token store, generic OAuth backend, device-code flows for Google, Qwen, and Antigravity;
claude_code_oauth()reads token from local claude CLI settings - Antigravity provider: full registry, catalog, and lane-registry integration for
ag/model family (Claude Opus/Sonnet 4.6, Gemini 3.x variants via Google Antigravity gateway) - Local worker GPU metrics: probe GPU/VRAM usage from Ollama (
/api/ps) and vLLM (/metrics);GpuInfosurfaced in discovery output and provider config - Dynamic model enumeration:
dynamic_modelsfield onDiscoveredWorker; discovered models preferred over static defaults ingenerate_provider_config - Grid worker discovery: reads
~/.faigrid/config.json(JSON format) with fallback to legacy key=value state file - Per-client budget limits:
cost_limit_usd_dayandcost_limit_usd_monthfields in client profile config; HTTP 429 returned before routing when threshold is reached - Anomaly detection:
MetricsStore.get_anomalies()compares recent window to rolling baseline for error rate, latency, cost, and traffic spikes - Alerts API:
GET /api/alertswith configurablelookback_hoursandbaseline_hoursparameters
google-vertexrenamed togoogle-gemini-cliin registry and catalog (alias preserved for backward compatibility)
- Shell parity and intelligence: CLI commands now integrate deeply with dashboard
--suggestargument analyzes metrics to recommend relevant CLI commands--linkgenerates dashboard deep‑link URLs with filters preserved- All CLI commands (
overview,recent,daily,trends) show dashboard links - Filter arguments (
--provider,--modality,--client‑profile, etc.) work across commands - Dashboard links include matching filters for seamless CLI→dashboard navigation
- Safe config workflows: New
faigate-configCLI for config managementpreview: Preview config changes before applyingdiff: Show detailed config differencesapply: Apply config changes with backup and confirmationvalidate: Validate config syntax and structure
- Clipboard integration:
--copyflag copies dashboard URLs to clipboard (macOS/Linux/Windows) - Scope suggestions: CLI suggests relevant commands based on metrics analysis (failure rates, provider concentration, costs, recent activity)
- Local worker auto‑discovery:
faigate-config discoverautomatically detects local AI workers (Ollama, vLLM, LM Studio, LiteLLM) and suggests configuration snippets - Complete provider coverage: All LLM AI Router custom endpoints now represented in the provider catalog
- Added missing providers: xAI, Z.AI, Mistral, Groq, HuggingFace, MoonshotAI, MiniMax, Volcano Engine, BytePlus, Qwen, OpenAI Codex, OpenCode Zen, Cerebras, GitHub Copilot, Synthetic, Kimi Coding, Vercel AI Gateway
- Generic provider support (OpenAI, Anthropic, Google) with config examples
- KiloCode model‑level access: individual catalog entries for
kilo‑auto/frontier,kilo‑auto/balanced,kilo‑auto/free - Consistent
recommended_modelvalues across all providers
- Local worker examples: Commented configuration templates for Ollama, vLLM, LM Studio, LiteLLM in
config.yaml - Enhanced provider catalog: 41 curated provider entries (up from 17) with official source URLs, signup links, and volatility ratings
- CLI help text updated with new arguments and examples
- Dashboard deep links use proper URL encoding and parameter validation
- Existing CLI commands remain fully backward compatible
- Lane family decision factors table in dashboard Routes view with selection path breakdown per family
- Selection path categorization (same‑lane fallback, downgrade, primary) with colored pills
- Routes KPIs extended with same‑lane fallback and downgrade traffic percentages
- Enhanced route explainability for operator trust (v1.21.x roadmap)
- Updated dashboard HTML and JavaScript to include new panel and aggregation logic
- Bumped version to 1.21.0
- No breaking changes; existing routing behavior remains compatible
- External metadata integration: promotion alerts, source badges, provider-mix analytics endpoint (Issue #186)
- Route explainability dashboard and metrics: route_summary column, decision history panel, why_selected and alternatives display (Issue #188)
- Added
/api/analytics/provider-mixendpoint for comparing providers based on external catalog pricing - Enhanced dashboard Routes view with "Route decision history" table showing routing explanations
- Added
route_summaryfield to metrics DB and/api/tracesendpoint
- Updated config.yaml metrics db_path default to
./faigate.dband enabled metrics by default - Extended
_build_route_summaryfunction to populate why_selected and alternatives - Updated all six
log_requestcalls to include route_summary
- No breaking changes; existing routing behavior remains compatible
- Added router integration with offerings catalog for price-aware routing decisions (Phase 2b)
- Added package scoring based on remaining credits and expiry dates for intelligent routing
- Added detailed package overview to dashboard with credits, expiry, and provider mapping
- Added
_metadata_packages_detail()function for detailed package insights - Enhanced dashboard with package details section and cost projection improvements
- Updated router cost estimation to prefer offering-specific pricing over provider defaults
- Improved provider dimension scoring with package score integration
- Extended dashboard metadata catalogs summary with package details
- No breaking changes; existing routing behavior remains compatible
- Added cost projection wizard CLI (
faigate-stats --project) for estimating costs across providers based on token usage patterns (Phase 2c) - Added package management UI with enhanced dashboard views for packages, expiry alerts, and credit tracking
- Added analytics integration with
--trendsflag showing daily cost trends and projected monthly spend - Added
faigate.costmodule with provider cost estimation and cross-provider comparison utilities
- Extended dashboard alerts view with packages block showing credits, expiry, and expiring-soon warnings
- Enhanced CLI with
--trendsflag for historical cost/performance trend analysis - No breaking changes; existing routing behavior remains compatible
- Added external metadata schemas and catalogs for models, offerings, and packages (Phase 2a)
- Added environment variables
FAIGATE_OFFERINGS_METADATA_FILEandFAIGATE_PACKAGES_METADATA_FILE - Added
get_offerings_catalog()andget_packages_catalog()public API functions - Updated
sync-metadata.shto touch offerings and packages catalog files
- Extended provider catalog loading to support offerings and packages catalogs alongside providers
- No breaking changes; all existing functionality remains unchanged
- Added an optional shared provider metadata overlay path so Gate can load repo-backed provider catalog snapshots and merge them into the runtime catalog.
- Added
faigate-provider-metadata-syncplus restart/update integration so provider metadata snapshots can be materialized automatically before Gate restarts.
- Documented the fusionAIze-only shared metadata repo shape and shipped example catalog/overlay JSON for Gate, including initial tracked metadata coverage for
anthropic-haiku,anthropic-sonnet, andgemini-pro.
- (New release baseline)
- (New release baseline)
- Enhanced provider catalog system with cost truth reporting, priority clusters, and actionable recommendations similar to llmairouter.com
- Integrated external
fusionaize-metadatarepository for centralized provider metadata management - Added numeric pricing rates lookup from external catalog, overlay, and built-in registry
- Added dashboard metric cards for cost truth and priority cluster visualizations
- Added provider discovery recommendations with actionable improvement suggestions
- Increased line length to 120 characters (modern standard) across codebase
- Reframed Claude-native bridge model aliases around routing intent instead of direct frontier spend: built-in Claude Code model ids now resolve to
auto,premium, orecoso Gate can still choose the cheapest capable route for the request - Tightened the shipped config and integration examples around coding auto modes, so
claude,opencode,openclaw, and related coding clients can share clearercoding-auto,coding-fast, andcoding-premiumentry points instead of muddled provider-first defaults - Updated the roadmap and implementation plan to prioritize cost-aware coding auto modes first, then stronger product surfaces and licensing-aware stack boundaries for Gate as a standalone product
- Added a dedicated dashboard IA document so the next web and shell dashboard work is grouped around operator jobs such as overview, providers, clients, routes, analytics, request log, integrations, and troubleshooting instead of one long admin surface
- Removed hardcoded user path (
/Users/andrelange/Documents/repositories/github/fusionaize-metadata) from external metadata integration - Changed default metadata root to non-existent path, preventing unauthorized directory access requests
- Updated
sync-metadata.shto use~/.faigate/metadataorFAIGATE_METADATA_DIRenvironment variable - External metadata remains opt-in via
FAIGATE_PROVIDER_METADATA_DIRenvironment variable
- Added an optional Anthropic-compatible bridge inside Gate with
POST /v1/messagesandPOST /v1/messages/count_tokens, so Claude-native clients can enter through a dedicated surface without splitting routing, policy, health, or fallback behavior into a second gateway - Added an internal canonical request and response layer for bridge traffic, which keeps Anthropic-shaped ingress mapping separate from the existing routing and completion core instead of adding one-off protocol logic directly in the router
- Added a community
claude-code-routerhook that can prefer coding-strong, tool-capable, and larger-context routes for Claude Code traffic without making the bridge itself depend on any one routing policy - Added bridge-specific validation and release-readiness helpers, including a client-near validation script and an explicit bridge release checklist for opt-in production rollouts
- Expanded the provider source catalog scope beyond
blackbox,kilo, andopenaiso Gate can also track mirrored official source data foranthropic,deepseek, andgoogle - Added local models-endpoint overlays per configured route, which lets Gate compare what a specific key can really see against the mirrored global provider catalog
- Hardened Anthropic bridge compatibility for real operator workflows: basic
tool_use/tool_resultflows now stay on the same execution path, Anthropic version and beta headers survive the bridge, and bridge responses expose the key route-resolution headers needed for debugging - Improved quota-aware fallback behavior for Anthropic-shaped traffic by introducing shared quota metadata on routes, which lets Gate avoid blindly retrying another path that is still backed by the same exhausted Anthropic or BYOK quota domain
- Clarified the Bridge release position across docs:
v1.13.0ships the Anthropic surface as opt-in and production-usable for early adopters, but does not claim full Anthropic, Claude Code, or Claude Desktop parity yet - Aligned the doctor and bridge validation tooling with non-default live configs so release validation runs against the same configured DB, env file, and runtime instance instead of silently falling back to repo-local defaults
- Provider source alerts now distinguish more clearly between global catalog drift and key-specific route/model visibility drift
- Catalog summaries now include local route counts, local visible model counts, and route-vs-catalog mismatch hints instead of only source freshness and change counts
- Added a provider source catalog line with startup refresh, dashboard/API summaries, and operator-facing alert actions across
faigate-doctor,faigate-provider-probe, and Quick Setup so model/pricing drift is visible earlier instead of hiding behind stale curated assumptions - Added explicit Kilo paid workhorse lanes for Sonnet and Opus plus Kilo-specific routing fit scoring, which lets Gate model premium, balanced, and free Kilo traffic without relying on opaque
kilo-auto/*header behavior - Added route-preview coverage for Kilo frontier lane selection so operators can see when Gate chose
kilo-opus,kilo-sonnet, orkilocodeand why - Added stronger release automation dry-run coverage so the release helper itself is exercised in CI before a tagged release is cut
- Hardened release automation end-to-end: local release scripts now validate versions more strictly, verify package metadata coherency, and point to the dedicated
fusionAIze/homebrew-taprepository instead of assuming a local formula in this repo - Release artifact publishing now validates tag/version alignment before publishing and reuses prebuilt Python artifacts for PyPI instead of rebuilding a second time in the publish job
- Reframed the legacy
blackbox-freeroute as a low-cost burst path rather than a guaranteed free path, because the currently working curated model is not reliably the:freeSKU for every key - Updated Kilo defaults and examples to use the current gateway base URL without the stale
/v1suffix
- Restored Python 3.10 compatibility for the release update helpers by falling back cleanly when
datetime.UTCis unavailable, which fixes the release CI collection failure that blocked thev1.11.xline - Realigned the runtime version surfaces so package metadata,
faigate --version, and the FastAPI app version all move together again instead of reporting mixed1.10.1/1.11.xvalues
- Established the current release-driven changelog baseline so subsequent
v1.11.x+entries stay grouped by real user-visible behavior instead of placeholder release notes
- Gemini 3 / 3.1 Modernization — full rollout of Google Gemini 3 Flash and Gemini 3.1 Pro (High/Low) models across all surfaces:
google/gemini-flashnow resolves togemini-3-flashgoogle/gemini-flash-litenow resolves togemini-3-flash-litegoogle/gemini-pro-highandgoogle/gemini-pro-lowadded for high-reasoning and balanced Gemini 3.1 Pro lanes
- Flexible Model Labels — centralized model version mapping in
lane_registry.py:- New
_ACTIVE_MODEL_VERSIONSand_MODEL_VERSION_LABELSlookup tables - Decouples canonical lanes (e.g.
openai/gpt-4o) from concrete provider strings (e.g.gpt-4o) - Ensures consistent labels and IDs across config, catalog, wizard, and dashboard
- New
- Updated Catalog & Wizard —
provider_catalog.pyandwizard.pyrefactored to use dynamic model helpers:- Removes hardcoded Gemini 2.5 strings from recommendation logic
- Synchronizes curated aliases and notes with the new versioned metadata
- Release Automation — new
scripts/faigate-releasePython tool to automate version bumping, changelog updates, and Homebrew formula syncing.
lane_registry.pynow exportsget_active_model_id(canonical_id)andget_active_model_label(canonical_id)for shared use.- Anthropic default model in wizard updated to
claude-3-5-sonnet-20241022(Sonnet 4.6).
hooks/adapters/grok_api_adapter.py— OpenAI-compat adapter that bridges faigate's virtualgrok-xaiprovider to Grok's web interface (no XAI API key required):- Exposes
GET /v1/modelsandPOST /v1/chat/completionson port 8091 - Translates OpenAI messages array → single Grok prompt (system prompt + history + last user message)
- Maps model names:
grok-3→grok-3-auto,grok-3-fast,grok-4,grok-4-mini-* - Full streaming via SSE (uses Grok-Api's
stream_responsetoken list) - Runs from fusionAIze/grok-api-hook fork for stability
GET /healthendpoint for liveness checking
- Exposes
- Virtual provider registration — community hooks can now register providers programmatically without
config.yamlentries:register_virtual_provider(name, config)inhooks.py— validatesbase_url+model, sets safe defaultsget_virtual_providers()— returns all registered virtual providersload_community_hooks()now passesregister_virtual_provideras optional second arg when hook'sregister()accepts itmain.pystartup merges virtual providers into_providersafter config-defined providers (config wins on name collision)
grok-wrapperupdated — now registersgrok-xaias a virtual provider (tier: mid, cost: free, latency: slow) pointing tohttp://127.0.0.1:8091/v1with full lane + capabilities metadata
hooks/grok-wrapper.pynow uses two-argregister(register_fn, register_provider_fn)signature- All references updated to use fusionAIze/grok-api-hook fork
- Cache Intelligence layer — all providers now carry precise cache metadata in
config.yamland the routing engine uses it for cost estimation and scoring:cache.min_prefix_tokens— minimum stable prefix required for cache activation (provider-specific: 64 for DeepSeek, 1024 for Google, 1024 for Anthropic)cache.ttl_seconds— provider cache lifetime (0 = unknown; Google: 3600 s, Anthropic: 300 s)cache.max_cached_tokens— maximum prefix retained in cache (64k for DeepSeek, 1M for Google, 32k for Anthropic)cache.cache_read_discount— actual cost ratio of cached vs fresh input tokens (e.g. DeepSeek: 0.07, Anthropic: 0.10, Google Flash: 0.04)cache.cache_write_surcharge— write cost multiplier for explicit-mode caches (Anthropic: 1.25, others: 1.0)- Cache threshold in
router.pyis now provider-aware (max(64, min_prefix_tokens)per provider) - Cache scoring bonus in
router.pyrewards providers where cache is likely to activate given the current request shape /routeendpoint response now includes acache_intelligenceblock with activation forecast, estimated savings, TTL, and write surcharge
- Community / plugin hook system — faigate now supports dropping custom Python hooks into a directory without editing core code:
load_community_hooks(plugin_dir)inhooks.pyscans*.pyfiles in the configured dir and calls theirregister(register_fn)entry pointcommunity_hooks_dirconfig key added torequest_hookssection; community hooks are loaded before hook-name validation so plugin names pass cleanly- Community hooks are logged at startup and exposed in
/healthresponse undercommunity_hooks get_community_hooks_loaded()utility function for observability
hooks/grok-wrapper.py— first community hook example, ships with faigate:- Automatically routes requests to
grok-xaiwhen the model name is a known Grok variant (grok-3,grok-3-mini,grok-3-fast,grok-2, …) or starts withgrok- - Also triggered by
X-Faigate-Grok: 1/true/yesrequest header - Includes full install instructions and self-documenting docstring
- Automatically routes requests to
grok-xaiprovider template inconfig.yamlsection B — full lane + cache + capabilities metadata for xAI Grok 3 (commented out; activate withXAI_API_KEY)- Updated
request_hooksconfig comment block to documentcommunity_hooks_dir, example usage, and grok-wrapper installation steps
- Fixed
routing_modefrom request hooks being silently discarded —_sanitize_routing_hintsnow accepts and preservesrouting_modeas a first-class hint field;_merge_routing_hintspropagates it through the hook pipeline soX-faigate-Modeheader overrides correctly reach the scoring layer - Fixed
X-faigate-Mode: ecoandX-faigate-Mode: premiumbeing ignored on short prompts —_evaluate_heuristic_matchnow bypassesshort-messageandgeneral-defaultrules when an explicitrouting_modehint is present, allowing mode-specific scoring to run regardless of token count
- Three new providers using existing API keys — no new credentials required:
anthropic-sonnet: Claude Sonnet 4.6 (claude-sonnet-4-6) — quality-workhorse lane,cost_tier: standard(~$3/MTok input), high reasoning and tool strength, degrade-to: haiku → deepseek-chatanthropic-haiku: Claude Haiku 3.5 (claude-haiku-3-5) — fast-workhorse lane,cost_tier: cheap(~$0.80/MTok input), degrade-to: deepseek-chat → gemini-flashgemini-pro: Gemini 2.5 Pro (gemini-2.5-pro) — quality-workhorse lane,cost_tier: premium, high reasoning and context strength (1M token context window), degrade-to: gemini-flash → deepseek-reasoner
- Added proper
lane:metadata block togemini-flash-lite(was missing, preventing correct cluster-based scoring) - Updated global
fallback_chainto reflect full provider depth: deepseek-chat → anthropic-haiku → gemini-flash → deepseek-reasoner → anthropic-sonnet → gemini-pro → openai-gpt4o → openrouter-fallback → anthropic-claude → kilocode → blackbox-free - Updated
routing_modes.ecoto explicitly prefer anthropic-haiku, gemini-flash-lite, gemini-flash, deepseek-chat - Updated
routing_modes.premiumto prefer anthropic-sonnet, openai-gpt4o, gemini-pro, anthropic-claude, deepseek-reasoner - Updated
opencodeclient profile to includehighquality tier so Sonnet/Gemini Pro are reachable in auto mode - Added
anthropic-sonnet,anthropic-haiku,gemini-protomodel_shortcuts - Enabled
routing_modes(wasenabled: false)
- Corrected version strings in
__init__.pyandmain.pywhich incorrectly reported1.8.0after the v1.9.0 release - Fixed
load_dotenv()inconfig.pyso the service correctly resolvesfaigate.envfrom the config directory (/opt/homebrew/etc/faigate/) instead of searching upward from the package installation path, which caused all providers to start inunresolved-keystate when run via Homebrew launchd
- Added
mode-override-headerrequest hook that reads the newX-faigate-Modeheader and maps it to a routing posture (auto,eco,premium,free, plus common aliasesquality,save,cheap,balanced,standard); unknown values are silently ignored - Updated
_routing_posture()to checkhook_hints.routing_modebeforeprofile_hints.routing_modeso the header override takes effect end-to-end - Expanded
opencodesignal groups from 5 to 10 by addingdevops(kubernetes, terraform, helm, ci/cd, …),testing(unit tests, integration tests, pytest, jest, tdd, coverage, …),security(jwt, oauth, xss, sql injection, csrf, rbac, …), anddatabase(schema, query optimization, index, replication, sharding, …) — each group triggersshort_complexescalation to reasoning lanes when ≥ 2 groups fire on a brief prompt - Added plural keyword forms (
unit tests,integration tests) to thetestingsignal group so word-boundary matching no longer silently drops plural prompts - Extended
_OPENCODE_COMPLEXITY_HINTSand_OPENCODE_COMPLEXITY_RULE_KEYWORDSwith event sourcing, cqrs, kubernetes, terraform, infrastructure as code, unit test, integration test, jwt, sql injection, vulnerability, schema, replication, and query optimization terms - Added
short_complexandprefer_providersbypass guards in_evaluate_heuristic_matchso brief cross-domain prompts and explicit provider-preference requests skip theshort-messageandgeneral-defaultfallthrough rules and reach the profile scoring layer
- Strengthened short-but-risky
opencodeprompt detection so brief architecture, queue/backpressure, and rollout-planning requests escalate out of cheap lanes earlier instead of being flattened by generic short-query heuristics - Expanded route-preview explainability with structured complexity reasons plus explicit
why_not_selectedguidance for cheaper alternatives, so operators can now see why a lower-cost lane lost on reasoning depth, benchmark fit, freshness, or runtime pressure
- Started the adaptive-orchestration runtime line with canonical model-lane and provider-route metadata in config, wizard, runtime inventory, and provider-catalog surfaces
- Added the first lane-aware router scoring slice so
quality,balanced,eco, andfreepostures now influence candidate ranking through lane cluster, benchmark cluster, route type, and runtime pressure instead of only provider tier - Added Same-Lane-Route fallback preference before weaker cluster downgrades when a compatible alternate route exists for the same canonical model
- Added an in-memory adaptation state for rate-limit, quota, timeout, and latency pressure so hot routes can be demoted conservatively at runtime
- Persisted routing explainability fields such as
canonical_model,route_type,lane_cluster,selection_path, anddecision_detailsinto metrics and route traces - Expanded candidate cards, client scenarios, and provider dashboard drilldowns so operators can now see route mirrors, degrade chains, canonical lanes, and runtime penalties directly in Gate
- Tightened the terminal header rendering again so interactive screens no longer insert apparent blank spacer lines between the three wordmark rows
- Fixed the client-scenario apply flow so choosing
Write confignow returns cleanly to the calling menu after the confirmation step instead of dropping operators straight back into the same scenario list
- Added internal Gate drilldowns for client quickstarts, provider discovery, and dashboard details so operators no longer need to leave the menu just to open one parameterized view
- Expanded client scenarios into lane-based explanations with explicit quality, reasoning, workhorse, budget, and fallback roles so templates like
opencode / balancednow explain whykilocode,blackbox-free, oropenrouter-fallbackare in or out - Added family-coverage hints for scenario output so operators can see when a provider family currently has only one quality or balanced slot and would need separate provider entries for richer
Opus / Sonnet / Haiku-style splits - Refined the shell header color segmentation again to match the tighter blue / yellow / blue / green brand grouping across all three wordmark rows
- Hardened config-wizard merge writes so existing configs with
nullsections such asclient_profiles.rules,routing_policies.rules, orrequest_hooks.hooksnow merge into real runtime config safely instead of failing mid-write - Closed the remaining Homebrew helper-parity gap so user-facing commands such as
faigate-config-wizard,faigate-status,faigate-restart,faigate-logs,faigate-start,faigate-stop,faigate-update, andfaigate-auto-updateship through the Brew formula too - Refined the terminal wordmark again with the new three-color brand palette and kept the inline version sourced dynamically from the current package version
- Fixed the config-wizard write path so guided
Write configflows persist the actual runtime config instead of accidentally writing thepurpose/client/suggestionssummary payload back intoconfig.yaml - Added an explicit doctor warning when
config.yamlappears to contain wizard summary keys, which makes accidental miswrites easier to catch before restart and rollout work - Restored executable bits for packaged helper scripts such as
faigate-config-wizard,faigate-config-overview,faigate-provider-discovery, and the onboarding/client helper scripts so Brew-installed helper entrypoints no longer fail withPermission denied
- Fixed the packaged
faigate-dashboardhelper so the shipped script keeps its executable bit and the Brew-installed dashboard no longer fails withPermission denied - Polished the interactive terminal wordmark again so the large
Ialigns with the intended shape and the current version now appears inline at the right edge of the logo in the same subdued tone as the subtitle
- Added
faigate-provider-setupplus matchingQuick Setup/Configuremenu entries so operators can add known providers, custom OpenAI-compatible upstreams, and local workers before dropping into the purpose-aware config wizard - Added
faigate-provider-probeso configured sources can be checked against config, env, and the live/healthpayload before client rollout begins - Added
faigate-client-scenariosplus matching menu entries so operators can apply named templates such asopencode / eco,opencode / quality,n8n / reliable, orcli / freeinstead of thinking only in raw profile-mode edits - Added
faigate-dashboardplus a new top-levelDashboardmenu section so operators now get one shell-native performance view for traffic, latency, spend, token volume, provider/client hotspots, and action-oriented alerts
-
Tightened the onboarding docs and main README around the new provider-source-first UX so first setup now reads more like
Provider Setup -> Provider Probe -> API Keys -> Full Config Wizard -> Client Scenarios -> Validate -> Client Quickstarts -
Renamed the old
FOUNDRYGATE STATSCLI banner tofusionAIze Gate Statsso the terminal metrics surfaces stay on-brand -
Expanded client scenarios with clearer
budget,best when, andtradeoffguidance so operators can pick templates by intent instead of only by routing-mode names -
Expanded the new dashboard with budget, quota, and routing-pressure hints so it now helps answer whether traffic should shift, a cheaper scenario is worth trying, or a provider likely needs more budget
-
Added a dedicated adaptive-orchestration roadmap that sketches the path from lane metadata to scoring, live adaptation, benchmark freshness, and budget-/quota-aware routing through the
v1.10.xandv1.11.xlines
- Reworked the interactive config wizard candidate screen so purpose/client selection now shows compact
Ready now,More options if you add keys, andOptional specialty add-onscards instead of a raw provider metadata dump - Improved the client quickstart surfaces so the menu and client helper now show a clearer
Best next stephint and friendlierPreset matcheswording instead of implying thatPresets 0means something is broken - Clarified the API-key helper so provider base URL overrides are explicitly labeled as optional upstream overrides, reducing confusion between local Gate client URLs and upstream provider endpoints
- Nudged the terminal logo spacing closer to the intended fusionAIze Gate wordmark in interactive screens
- Fixed the standalone shell helpers on macOS/Homebrew so service status, logs, and service-manager labels now recognize the Brew-managed
homebrew.mxcl.faigatepath instead of assuming only the manual LaunchAgent path - Fixed
faigate-menumodel listing so it parses the/v1/modelspayload correctly instead of trying to read JSON through a broken stdin pipeline - Fixed
faigate-auto-updateon macOS's default Bash 3.2 by removing themapfiledependency from its payload parsing path - Fixed user-facing helper scripts so
--helpexits safely instead of accidentally triggering live install/update logic in shell environments that only wanted usage text - Improved
faigate-health,faigate-update-check, andfaigate-menuso operators now see compact human-readable summaries before diving into raw payloads - Added a service-manager mismatch warning when
/healthresponds but the configured manager reports a stopped or missing service, which helps catch stale old runtimes still bound to the same port - Polished the terminal header to align more closely with the intended fusionAIze Gate visual identity in interactive terminals
- Added a dedicated
Quick Setuphappy path and summary cards for gateway, config, providers, and clients in the main menu flows - Updated the client helper and the
Clientsmenu so operators see compact recommendation cards first and can drill into one client without dumping the full cross-client quickstart wall every time - Added first
Next stepreceipts after the key guided actions in the shell flow so wizard, validation, restart, and client-setup paths now end with a short operator-oriented “what to do next” block
- Added a first
faigate-menucontrol center with a shared terminal UI, the new fusionAIze Gate header, and consistentq/cnavigation across status, configure, explore, validate, control, and update menus - Added
faigate-api-keysandfaigate-server-settingsso API keys, host, port, and log-level changes have a Gate-native interactive path instead of living only in external orchestration layers - Added
faigate-routing-settingsso the global default routing mode and client-profile routing defaults can be reviewed and adjusted from the same Gate-native control flow - Added
faigate-client-integrationsplus aClientssection infaigate-menuso OpenClaw, n8n, opencode, and generic CLI quickstarts can be reviewed and driven through client-scoped wizard flows - Added
faigate-config-overviewplus a clearerCurrent Config/Guided Setup/Direct Settingssplit insidefaigate-menuso configuration flows now map more cleanly to the later Grid-style orchestration model
- Aligned helper scripts such as
faigate-health,faigate-status,faigate-update-check,faigate-auto-update, andfaigate-doctoraround shared config/env/port resolution so repo, packaged, and later Grid-driven flows can behave consistently - Extended install and Homebrew helper exposure so the new menu/config helpers can ship through the same operator-facing paths as the existing scripts
- Expanded
faigate-status,faigate-logs, andfaigate-restartso service control now carries clearer service-manager context, recent-vs-live log flows, and restart verification instead of only raw process-manager commands - Polished
faigate-menuwith compact runtime/config snapshots in the main and control/config submenus plus short inline tips so the shell UX stays self-orienting between steps
- Renamed the product branding from
FoundryGatetofusionAIze Gateacross the repository, documentation, examples, and operator-facing surfaces - Renamed the technical runtime slug from
foundrygatetofaigate, including the Python package, npm CLI package, helper scripts, example file names, service templates, and Homebrew formula path - Moved the repository references from
typelicious/FoundryGatetofusionAIze/faigateand aligned env prefixes, headers, and operational examples with the newFAIGATE_/x-faigate-*naming - Completed the first release-prep baseline for the rebrand so future releases, installs, and documentation no longer depend on the old names
- Added a first
faigate-config-wizardhelper that suggests an initialconfig.yamlfrom the API keys already present in.env - Added first-class
routing_modesandmodel_shortcutsconfig blocks so virtual model ids such asauto,eco,premium,free, or custom names can participate in routing - Added wizard candidate listing and conservative config merging so operators can select multiple provider candidates during first setup or later catalog-driven updates
- Added config-aware wizard update suggestions so existing installs can see
recommended_add,recommended_replace, andrecommended_keepgroups before applying provider changes - Added wizard
recommended_mode_changessuggestions so existing client profiles can be nudged toward the current purpose-aware routing defaults without silently rewriting them - Added an
apply suggestionswizard flow so selected provider and client-mode recommendations can be merged into an existing config without manual copy/paste - Added a wizard dry-run change summary so operators can preview added providers, model replacements, fallback changes, and client-mode changes before writing config updates
- Added optional wizard write-backup snapshots so config updates can keep a local pre-change copy before overwriting
config.yaml - Added a built-in
faigate-config-wizard --helpflow so first setup, catalog review, update suggestions, dry-run previews, and backup-aware writes are all discoverable directly from the CLI - Added optional provider-catalog discovery metadata and env-backed signup-link overrides so future CLI or control-center surfaces can show disclosed provider links without mixing link configuration into normal config files
- Added first CLI surfacing of disclosed provider discovery links in onboarding and doctor outputs, always alongside a link-neutral recommendation policy signal
- Added
faigate-provider-discoveryfor one compact text/JSON discovery view that later browser or control-center work can consume - Added discovery-link filters for CLI and API views so operators can narrow provider links by
offer_track,link_source, ordisclosed_only
client_profilescan now choose a defaultrouting_mode, letting one client keep the global mode while another uses a different or custom mode by defaultGET /v1/models, route previews, and runtime response headers now expose configured routing modes and resolved shortcut/mode metadatafaigate-doctor, onboarding reports, and the provider-catalog API now surface curated model-drift, source-confidence, volatility, and catalog-freshness alerts for configured providers- Provider catalog entries now distinguish direct providers from aggregators and wallet routers, track auth modes such as
api_key,byok, andwallet_x402, and keep community watchlists explicitly secondary to official sources faigate-config-wizardcan now filter candidates by purpose and client, accept multi-select provider input, and merge selected providers back into an existing config instead of forcing a full rewrite- Tightened the roadmap and user-facing docs around
v1.3.0so guided setup, catalog-assisted updates, and future recommendation-link work stay transparent and clearly separated from ranking logic - Provider discovery metadata now carries an explicit link-neutral recommendation policy so provider-link configuration can never be mistaken for a ranking signal
- Hardened the Homebrew formula so native Python extensions such as
pydantic-coreandwatchfilesare built from source with extra Mach-O header padding on macOS instead of relying on the vendored wheel layout - Strengthened the formula test so it validates the wrapped
faigate --versionentrypoint instead of only importing the package insidelibexec - Fixed the Python service entrypoint so
python -m faigate.mainand the Brew-managed wrapper both execute the runtime correctly - Clarified in the README, workstation guide, and troubleshooting docs that active Python virtualenvs can shadow the Brew-installed
faigatebinary
- Switched the Homebrew formula baseline from
python@3.13topython@3.12to reduce macOS packaging friction around vendored native Python wheels - Clarified in the README and workstation docs that
brew install faigateresolves cleanly after tappingfusionAIze/faigate, while the fully qualified install path remains the safest first-run example
- Added a workstation operations guide for Linux, macOS, and Windows runtime layouts
- Added a macOS
launchdLaunchAgent example for local workstation installs - Added Windows PowerShell and Task Scheduler starter examples for local workstation installs
- Added platform-aware runtime helper scripts so macOS can use the same
faigate-install/start/stop/statusflow style as Linux - Added a project-owned Homebrew formula plus
brew servicesguidance for packaged macOS workstation installs - Added explicit
FAIGATE_CONFIG_FILEconfig discovery andfaigate --config/--versionsupport so service wrappers and packaged installs can point to config outside the repo - Added a helper-level onboarding smoke test for explicit config/env/python wiring
- Updated the README quickstart so Linux, macOS, Windows, and Homebrew paths are visible earlier
- Replaced the weak PyPI workflow badge with clearer workstation and Homebrew badges
- Added richer client usage reporting in
GET /api/statsand the dashboard, including per-client tokens, failures, success rate, and aggregate client totals - Added a second wave of AI-native starter templates for Agno, Semantic Kernel, Haystack, Mastra, and Google ADK
- Added client highlight summaries to
GET /api/statsand the built-in dashboard for top request, token, cost, failure, and latency signals - Added a third wave of AI-native starter templates for AutoGen, LlamaIndex, CrewAI, PydanticAI, and CAMEL
- Tightened
staticandheuristicmatch semantics so combined fields now behave as cumulative constraints unlessany:is used explicitly - Tightened
policymatch semantics soclient_profileacts as an additive constraint inside one rule instead of bypassing sibling static or heuristic fields
- Added dashboard CSP hashes plus stricter response-security defaults for the no-build operator UI
- Added stronger provider base URL validation so non-local upstreams must use
https - Added reduced leakage of upstream provider failure details in client-facing error payloads
- Added a separate npm CLI package under
packages/faigate-clifor basic health, model, update, and route-preview checks - Added a documented
v1.0.0security review with mitigations and residual-risk notes - Added functional API coverage for upstream error sanitization on top of the earlier dashboard and request-boundary hardening tests
- Streamlined the root README into a shorter landing page and moved deeper API, configuration, and operations detail into dedicated docs pages
- Added conservative response-security headers plus a dashboard CSP for the no-build operator UI
- Added explicit
securityconfig controls for JSON body size, upload size, and bounded routing-header values - Added functional API coverage for dashboard headers, JSON request limits, upload limits, and sanitized routing-header behavior
- Added
faigate-onboarding-reportplus a testable onboarding report module for many-provider and many-client readiness checks - Added
faigate-onboarding-validateso onboarding blockers can fail fast in local setup and CI-style validation flows - Added built-in OpenClaw, n8n, and CLI quickstart examples to the onboarding report and integration docs so client onboarding can stay copy/paste friendly
- Added staged provider-rollout reporting and fallback/image readiness warnings so many-provider onboarding is easier to phase safely
- Added a client matrix to the onboarding report so profile match rules and routing intent are visible before traffic goes live
- Added starter example files for OpenClaw, n8n, and CLI clients under
docs/examples/so onboarding can begin from copy/pasteable templates - Added starter provider snippets for cloud, local-worker, and image-provider setups under
docs/examples/ - Added matching provider
.envstarter files for cloud, local-worker, and image-provider onboarding flows - Added provider env placeholder checks to
faigate-doctorso missing.envvalues are surfaced before rollout - Added
--markdownoutput tofaigate-onboarding-reportso onboarding state can be pasted into issues, PRs, or hand-off notes - Added delegated OpenClaw request and generic AI-native app profile starters to round out the
v0.8.xonboarding path
- Added stronger update-alert metadata to
GET /api/update, including update type, alert level, and recommended action for operators and dashboard consumers - Added an opt-in
auto_updatepolicy block plusfaigate-auto-updateso controlled deployments can gate helper-driven updates without enabling silent self-updates - Added
GET /api/operator-eventsplus operator-event metrics for update checks and helper-driven auto-update attempts - Added dashboard cards and tables for operator-side update checks and apply attempts
- Added provider-health rollout guardrails so helper-driven auto-updates can block when gateway health is already degraded
- Added
update_check.release_channelandauto_update.rollout_ringso operators can distinguish stable vs preview checks and tighter rollout rings - Added
auto_update.min_release_age_hoursso helper-driven auto-updates can wait for a release to age before becoming eligible - Added
auto_update.maintenance_windowso helper-driven auto-updates can stay inside explicit local maintenance hours - Added
auto_update.provider_scopeso rollout-health guardrails can evaluate only a selected provider subset - Added
auto_update.verificationso helper-driven auto-updates can run a post-update check and emit a rollback hint on failure
- Added modality-aware metrics and filters so stats, traces, recent requests, and the dashboard can distinguish
chat,image_generation, andimage_editing - Added
POST /api/route/imagefor dry-run preview of image-generation and image-editing routing decisions - Added optional
imageprovider metadata (max_outputs,max_side_px,supported_sizes) so image-capable providers can be ranked againstnandsize - Added top-level capability coverage to
GET /healthplusGET /api/providersfor filtered provider inventory and dashboard coverage views - Added shared request validation for image-generation, image-editing, and image-route preview payloads so invalid
size,n, and scalar fields fail fast before provider calls - Added optional
image.policy_tagsplus request-side image-policy hints so image routing can prefer providers tagged forquality,cost,balanced,batch, orediting
- Added
contract: image-providerplus OpenAI-compatiblePOST /v1/images/generationsandPOST /v1/images/editspaths for image-capable providers - Added a shipped Dockerfile and tag-driven release-artifacts workflow for Python distributions, GHCR images, and optional PyPI publishing
- Added public community-health and security baseline files: Code of Conduct, Security Policy, issue templates, PR template, Dependabot, and CodeQL
- Added generic onboarding helpers (
faigate-bootstrap,faigate-doctor) and a publish-dry-run workflow for GHCR and Python package validation - Added cached release update checks via
GET /api/update, the dashboard, andfaigate-update-check
- Added optional
request_hookswith a small built-in hook registry for per-request provider preferences, locality hints, and profile overrides - Added a dedicated routing layer for hook-provided hints before client-profile defaults
- Added dry-run route output for applied hooks, effective request metadata, and candidate ranking details
- Added provider route-fit metadata for
context_window, token limits, and cache behavior - Added filtered stats, recent-request, and trace queries for provider, client, layer, and success views
- Hardened the built-in dashboard with provider health, client breakdowns, route traces, URL-persisted filters, summary cards, and escaped rendering
- Deepened provider scoring so routing now considers health, latency, recent failures, cache alignment, and request headroom instead of only first-fit dimension checks
- Hardened request hooks with sanitized body updates and routing hints plus optional fail-closed behavior via
request_hooks.on_error
- Rebranded the public documentation around the fusionAIze Gate product name
- Completed the technical rename from earlier runtime identifiers to
faigate - Added validated provider capability metadata with normalized local/cloud and streaming defaults
- Added an optional policy layer for capability-aware provider selection on
autorequests - Added an explicit
local-workerprovider contract for network-local OpenAI-compatible runtimes - Added optional client profiles for caller-aware routing defaults based on request headers
- Added a dry-run route introspection endpoint at
POST /api/route - Added enriched route traces and client/profile breakdowns in metrics, stats, and CLI output
- Added startup and
/healthprobing forcontract: local-workerproviders viaGET /models - Added built-in
client_profilespresets foropenclaw,n8n, andcli - Added a repository
AGENTS.mdand a documented Git workflow formain,feature/*,review/*, andhotfix/* - Aligned release guidance around semantic-style
x.y.zversioning withv0.3.0as the first fusionAIze Gate-branded release
- Reworked the README into a more generic, portable open-source landing page
- Added clearer API, configuration, deployment, and helper script documentation
- Added release process documentation, roadmap updates, and a lightweight release checklist template
- Added architecture, integrations, onboarding, and troubleshooting docs for external users