* chore(ci): use OpenCode app credentials for fixer PRs
Mint GitHub App tokens for ci-fixer and issue-fixer so opened PRs
trigger CI and can be auto-merged, matching the opencode repo pattern.
* chore(ci): app credentials for ci-fixer and model sync only
Keep issue-fixer on GITHUB_TOKEN. Use the OpenCode app for ci-fixer
and sync-models so their PRs trigger CI.
* fix(ci): keep GITHUB_TOKEN for sync issue creation
Missing-model issues must be opened with GITHUB_TOKEN so issues.opened
does not fire; Issue Fixer is started only via repository_dispatch.
Use the app token only when reporting/pushing catalog PRs.
* feat(sync): add Merge Gateway model sync
* fix(merge-gateway): document reasoning controls
* fix(sync): preserve partial Merge Gateway metadata
* fix(merge-gateway): align route metadata sync
* fix(merge-gateway): treat supports_reasoning as a positive-only signal
The public /v1/models schema does not document supports_reasoning, and the
live catalog populates it inconsistently across vendor routes: the same
model reports true on one route and false on another (claude-opus-4-6 is
false via anthropic, true via bedrock), and reasoning-only models such as
deepseek-r1 report false on their sole route. Flipping reasoning = false
from that field erased curated reasoning metadata on 42 models.
- only confirm reasoning when an available route reports
supports_reasoning = true (always accompanied by route reasoning
metadata), defaulting reasoning_options to [] when none are curated
- preserve curated reasoning metadata when routes report false or omit
the field
- restore the 42 erased reasoning entries (claude, deepseek-r1, gpt-oss,
gemma, qwen, glm, nemotron, fugu) from curated values
- re-sync against the live catalog: gemini-embedding-001 added, route
cache_read prices and display names ingested, qwen3.5-27b limits and
modalities updated
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* chore(merge-gateway): refresh model catalog
* fix(merge-gateway): align synced model metadata
* docs(sync): trim Merge Gateway notes
* fix(merge-gateway): remove stale Qwen aliases
* test(merge-gateway): document sync coverage
* fix(merge-gateway): mark chat models as non-reasoning
---------
Co-authored-by: Matthew Feroz <matt.feroz@merge.dev>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
- Shrink helper to title-based dedupe (open+closed); drop marker parser
- Opt-in openIssues (=== true); enable only under GITHUB_ACTIONS by default
- Issue-fixer skips [missing-model] titles (hand-authored metadata only)
- Docs match the leaner behavior
- Parse marker null-safely; only accept double-quoted JSON attrs
- Dedupe via labeled issue list + in-memory match (fail closed on list errors)
- Per-model create errors keep notices; ensureLabel checks exit code
- Open issues by default only in CI; require --open-issues locally
- Pass GH_TOKEN to the sync workflow step so hourly runs can create issues
Implement the Kilo Gateway sync provider to fetch and synchronize model
metadata.
- Add `kilo` provider implementation
- Add `kilo:sync` script to `package.json`
- Update CI workflow to include `KILO_API_KEY`
- Add `kilo` to the `aggregators` group
- Update `sync.md` documentation
Add a DeepInfra sync provider mirroring the existing direct-provider pattern
(Baseten/Venice/xAI), keeping the catalog current automatically from the public
deploy catalog (https://api.deepinfra.com/models/list?type=text-generation).
Derived data:
- pricing: cents/token -> USD per million; cache_read from the cached-rate
multiplier; context-based tiers parsed from pricing.full (base + cost.tiers,
supporting an unbounded final tier), falling back to the flat price if the
string is unrecognized
- context window from max_tokens
- status="deprecated" only when the deprecated unix timestamp is in the past
(a future timestamp is a scheduled deprecation; the model is still served)
Capabilities (tags only turn a feature ON; an explicit `non-reasoning` tag is
the sole negative signal — otherwise the value is inherited from models/
metadata or the curated value, never clobbered with a default):
- tools -> tool_call
- structured-output -> structured_output (the generic `json`/JSON-mode tag does
not count)
- reasoning / can-disable-reasoning -> reasoning; can-disable-reasoning also
surfaces a `toggle` reasoning option
- multimodal/input-audio/input-video merge into existing modalities (never
dropping curated extras such as video)
Closed-weight passthrough families (anthropic/* Claude, google/gemini-*) are
excluded; open google/gemma-* models are kept.
Wiring: register deepinfra in sync/index.ts (providers map + direct group) so
the hourly sync-models workflow picks it up; add optional DEEPINFRA_API_KEY to
the workflow env and a deepinfra:sync npm script. deleteMissing: false — models
dropped from the API are retained and flagged, never auto-deleted.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a sync provider for the LLM Gateway (llmgateway.io) aggregator,
mirroring its public /v1/models catalog into providers/llmgateway.
The gateway exposes an OpenRouter-shaped response, but its
supported_parameters and modality data are noisy (it omits "tools" for
flagship models yet lists "temperature" for ones marked temperature=false).
So the gateway is treated as authoritative only for the volatile,
gateway-specific data — cost and served limits — while capability and
modality fields stay curated (preserved from the existing entry, which a
factored model inherits from its base). Only text-output models are synced.
- packages/core/src/sync/providers/llmgateway.ts: new provider
- packages/core/src/sync/index.ts: register in providers + aggregators
- package.json: add llmgateway:sync script
- .github/workflows/sync-models.yml: optional LLMGATEWAY_API_KEY
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mirror the existing daily model-catalog sync for the Hugging Face
Inference Providers router (https://router.huggingface.co/v1/models),
modeled on the baseten provider.
The router is an aggregator: each model is served by several inference
providers with their own pricing, context window, and capabilities, and
requests are routed to the fastest one. The provider collapses them into
the route a request would actually take -- pricing and context from the
highest-throughput provider, with tool/structured-output support taken
from any provider since a caller can pin a slower one.
New models are created via canonical base_model resolution (the same
resolveCanonicalBaseModel/factorBaseModel path baseten uses); unmappable
or unpriced models are skipped and reported in a notice. For now the sync
only creates new models -- existing curated TOMLs are left untouched via
sameModel -- and never deletes (deleteMissing: false).
HF_TOKEN is optional; the router model list is public.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PzQSYd3VwBK5NAsC9dYmSw