Implements external LLM routing via opencode CLI for: - GitHub Copilot (gpt-5.2, claude-sonnet-4.5, claude-haiku-4.5, o3, gemini-3-pro) - Z.AI (glm-4.7 for code generation) - OpenCode native (big-pickle) Components: - mcp/llm-router/invoke.py: Main router with task-based model selection - mcp/llm-router/delegate.py: Agent delegation helper (respects external mode) - mcp/llm-router/toggle.py: Enable/disable external-only mode - mcp/llm-router/providers/: CLI wrappers for opencode and gemini Features: - Persistent toggle via state/external-mode.json - Task routing: reasoning -> gpt-5.2, code-gen -> glm-4.7, long-context -> gemini - Claude tier mapping: opus -> gpt-5.2, sonnet -> claude-sonnet-4.5, haiku -> claude-haiku-4.5 - Session-start hook announces when external mode is active - Natural language toggle support via component registry Plan: gleaming-routing-mercury Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Hooks
Event handlers that run automatically during Claude Code sessions.
Active Hooks
| Event | Script | Purpose |
|---|---|---|
SessionStart |
scripts/session-start.sh |
Load context, check for pending items |
PreCompact |
scripts/pre-compact.sh |
Remind to preserve context before compaction |
Hook Events
| Event | When It Fires |
|---|---|
SessionStart |
When Claude Code session begins |
SessionEnd |
When session ends |
PreToolUse |
Before a tool is used |
PostToolUse |
After a tool is used |
UserPromptSubmit |
When user submits a prompt |
PreCompact |
Before context compaction |
Notification |
When notification is sent |
Configuration
Hooks are defined in hooks.json:
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/scripts/session-start.sh"
}
]
}
]
}
}
Adding Hooks
- Create script in
scripts/ - Make executable:
chmod +x scripts/your-hook.sh - Add to
hooks.json - Restart Claude Code
Script Output
- Stdout is injected into session as context
- Use format:
HookName:Callback hook success: Success - Additional context:
HookName hook additional context: <message>
Matchers (for Tool Hooks)
{
"matcher": "Write|Edit",
"hooks": [...]
}
Matches tool names with regex pattern.
Tips
- Keep hooks fast (<1s) to avoid delays
- Use
set -euo pipefailfor safety - Output useful context, not noise
- Test hooks manually before adding