65 lines
2.8 KiB
Markdown
65 lines
2.8 KiB
Markdown
# grok2api Model Patching Pattern
|
|
|
|
When adding a new Grok model to the grok2api codebase, 6 files across 3 layers must be updated.
|
|
|
|
## Files to Patch
|
|
|
|
### Layer 1: Control Plane — Model Registry
|
|
|
|
**`app/control/model/enums.py`**
|
|
- Add new `ModeId` enum value (e.g., `GROK_4_6 = 5`)
|
|
- Add mapping in `to_api_str()` method
|
|
- Add to `ALL_MODES_FULL` tuple
|
|
|
|
**`app/control/model/registry.py`**
|
|
- Add `ModelSpec` entries for the new model and its variants
|
|
- Example pattern:
|
|
```python
|
|
ModelSpec("grok-4.6", ModeId.GROK_4_6, Tier.SUPER, Capability.CHAT, True, "Grok 4.6"),
|
|
ModelSpec("grok-4.6-super", ModeId.GROK_4_6, Tier.SUPER, Capability.CHAT, True, "Grok 4.6 Super"),
|
|
ModelSpec("grok-4.6-heavy", ModeId.GROK_4_6, Tier.HEAVY, Capability.CHAT, True, "Grok 4.6 Heavy"),
|
|
ModelSpec("grok-4.6-best", ModeId.GROK_4_6, Tier.SUPER, Capability.CHAT, True, "Grok 4.6 Best", prefer_best=True),
|
|
```
|
|
|
|
### Layer 2: Control Plane — Account Models
|
|
|
|
**`app/control/account/models.py`**
|
|
- Add `grok_4_6: QuotaWindow | None = None` to `AccountQuotaSet`
|
|
- Add `mode_id == 5` case in `get()` method
|
|
- Add `mode_id == 5` case in `set()` method
|
|
- Add `grok_4_6` to `to_dict()` and `from_dict()`
|
|
|
|
**`app/control/account/commands.py`**
|
|
- Add `quota_grok_4_6: dict[str, Any] | None = None` to `AccountPatch`
|
|
|
|
### Layer 3: Data Plane — Runtime Tables
|
|
|
|
**`app/dataplane/shared/enums.py`**
|
|
- Add `GROK_4_6 = 5` to `ModeId`
|
|
- Add to `ALL_MODE_IDS` tuple
|
|
|
|
**`app/dataplane/account/table.py`**
|
|
- Add `quota_grok_4_6_by_idx`, `total_grok_4_6_by_idx`, `window_grok_4_6_by_idx`, `reset_grok_4_6_at_by_idx` column arrays
|
|
- Update `_quota_col()`, `_reset_col()`, `_total_col()`, `_window_col()` to handle `mode_id == 5`
|
|
- Update `_append_slot()` signature and body with `grok_4_6` parameters
|
|
- Update `_update_slot()` signature and body with `grok_4_6` parameters
|
|
|
|
## Verification
|
|
|
|
After patching, run syntax check:
|
|
```bash
|
|
cd C:\Users\User\grok2api\grok2api
|
|
python -c "
|
|
import ast, sys
|
|
for f in ['app/control/model/enums.py','app/control/model/registry.py',
|
|
'app/control/account/models.py','app/control/account/commands.py',
|
|
'app/dataplane/shared/enums.py','app/dataplane/account/table.py']:
|
|
ast.parse(open(f).read()); print(f'OK: {f}')
|
|
"
|
|
```
|
|
|
|
## Pitfalls
|
|
|
|
- **Columnar arrays**: the table.py uses typed `array.array` columns. Each new mode needs 4 new columns (quota, total, window, reset). The `_append_slot` and `_update_slot` methods have long parameter lists that must match exactly.
|
|
- **Mode ID consistency**: the control-plane `ModeId` and data-plane `ModeId` must have the same integer values. The data-plane enum is a separate copy in `dataplane/shared/enums.py`.
|
|
- **The protocol layer (`xai_chat.py`) uses `mode_id.to_api_str()` generically** — no changes needed there if the mode_id mapping is correct. |