Upgrade Chat Model
SkillAI & modelsLets your agent switch the AI chat model between fast and good across backend and frontend.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Upgrade Chat Model skill
About this capability
Upgrade an AI chat model (fast or good) across backend and frontend.
What this skill tells your AI
The instructions your AI receives, as published by macro-inc/macro in .agents/skills/upgrade-model/SKILL.md and read by ahel’s review.
Upgrades the AI model used in the chat app. There are two model slots:
- fast (Enter): default/fallback model (first entry in
CHAT_MODELS) - good (Cmd+Enter): smart mode model (second entry in
CHAT_MODELS)
The user must specify which slot to upgrade and the new model name (e.g. Codex-opus-4-6).
Steps
1. Determine the change
Ask the user (if not already provided):
- Which slot:
fastorgood? - What is the new model name? (e.g.
Codex-opus-4-6)
Derive from the model name:
SERDE_NAME: the kebab-case model ID sent over the wire (e.g.Codex-opus-4-6)ENUM_VARIANT: PascalCase variant name (e.g.Claude46Opus)CONST_NAME: SCREAMING_SNAKE constant name (e.g.CLAUDE_46_OPUS)CONST_VALUE: display string used by the frontend/provider (e.g.Codex-4.6-opus)PRETTY_NAME: human-readable name (e.g.Codex Opus 4.6)
2. Add model to AI crate (if it doesn't already exist)
File: crates/agent/src/model/predefined_model.rs
Check if the enum variant already exists. If not, add all of the following:
-
Enum variant in
pub enum Model(under the Anthropic section):#[serde(rename = "{SERDE_NAME}")] #[strum(serialize = "{SERDE_NAME}")] {ENUM_VARIANT}, -
String constant in
pub mod constants::models:pub const {CONST_NAME}: &str = "{CONST_VALUE}"; -
Match arm in
to_provider_model_string():Model::{ENUM_VARIANT} => (ANTHROPIC, {CONST_NAME}), -
Match arm in
from_model_str():{CONST_NAME} => Model::{ENUM_VARIANT},
File: crates/agent/src/model/predefined_model.rs
-
Metadata in
fn metadata():Model::{ENUM_VARIANT} => ModelMetadata { context_window: 200_000, },Use the correct context window for the model. Anthropic models are typically 200,000.
-
Provider in
fn provider():Model::{ENUM_VARIANT} => Provider::Anthropic,
3. Update DCS constants
File: services/document_cognition_service/src/core/model.rs
- If upgrading the fast slot: change the first entry in
CHAT_MODELSand updateFALLBACK_MODEL. - If upgrading the good slot: change the second entry in
CHAT_MODELS.
4. Update DCS chat message handler
File: services/document_cognition_service/src/api/ws/chat_message/mod.rs
Search for the old model variant being used in the model selection logic (e.g. Model::Claude45Opus). Update it to the new variant.
5. Verify Rust compiles
cargo check -p agent -p document_cognition_service
Fix any compilation errors before proceeding.
6. Generate frontend types
Run from apps/web/:
cd apps/web && bun install && bun run gen-api
This builds all Rust OpenAPI and models binaries from local code, generates openapi.json, runs orval for TypeScript types, and generates model.ts from the local models binary. All generated files will reflect your local Rust changes.
7. Run bun check to find frontend usages
cd apps/web && bun check
This will report TypeScript errors everywhere the old model string is used. Fix each one. Common locations:
apps/web/src/lib/core/component/AI/constant/model.ts—MODEL_PRETTYNAME,MODEL_PROVIDER_ICON,SMART_MODE_MODEL/DEFAULT_MODELapps/web/src/lib/core/component/AI/component/input/useChatInput.tsx— hardcoded model referencesapps/web/src/lib/core/component/AI/signal/pendingSend.test.ts— test data
Replace old model strings and update display names.
8. Format and verify
cd apps/web && bun format && bun check
The only errors remaining should be pre-existing ones unrelated to models (e.g. three, @aws-crypto/sha256-js type issues). All model-related errors must be resolved.
Finally, run the CI check:
cd apps/web && bun run gen-api -- --check
This must pass.
Notes
- We only support Anthropic models for chat. Other providers exist in the AI crate but are not used for the chat feature.
- The
ExhaustiveMaptype inconstant/model.tsrequires an entry for every model in theModeltype, so missing entries will cause type errors. - The
SMART_MODE_MODELconstant is the "good" model,DEFAULT_MODELis the "fast" model.
Signals
- GitHub stars
- 4k
- Forks
- 409
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
upgrade-model- Source
- github.com/macro-inc/macro