-
Notifications
You must be signed in to change notification settings - Fork 488
fix: map claude model ids to active provider model in proxy #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,98 @@ | ||
| #!/usr/bin/env bash | ||
| # rtk-hook-version: 3 | ||
| # RTK Claude Code hook — rewrites commands to use rtk for token savings. | ||
| # Requires: rtk >= 0.23.0, jq | ||
| # | ||
| # This is a thin delegating hook: all rewrite logic lives in `rtk rewrite`, | ||
| # which is the single source of truth (src/discover/registry.rs). | ||
| # To add or change rewrite rules, edit the Rust registry — not this file. | ||
| # | ||
| # Exit code protocol for `rtk rewrite`: | ||
| # 0 + stdout Rewrite found, no deny/ask rule matched → auto-allow | ||
| # 1 No RTK equivalent → pass through unchanged | ||
| # 2 Deny rule matched → pass through (Claude Code native deny handles it) | ||
| # 3 + stdout Ask rule matched → rewrite but let Claude Code prompt the user | ||
|
|
||
| if ! command -v jq &>/dev/null; then | ||
| echo "[rtk] WARNING: jq is not installed. Hook cannot rewrite commands. Install jq: https://jqlang.github.io/jq/download/" >&2 | ||
| exit 0 | ||
| fi | ||
|
|
||
| if ! command -v rtk &>/dev/null; then | ||
| echo "[rtk] WARNING: rtk is not installed or not in PATH. Hook cannot rewrite commands. Install: https://github.com/rtk-ai/rtk#installation" >&2 | ||
| exit 0 | ||
| fi | ||
|
|
||
| # Version guard: rtk rewrite was added in 0.23.0. | ||
| # Older binaries: warn once and exit cleanly (no silent failure). | ||
| RTK_VERSION=$(rtk --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1) | ||
| if [ -n "$RTK_VERSION" ]; then | ||
| MAJOR=$(echo "$RTK_VERSION" | cut -d. -f1) | ||
| MINOR=$(echo "$RTK_VERSION" | cut -d. -f2) | ||
| # Require >= 0.23.0 | ||
| if [ "$MAJOR" -eq 0 ] && [ "$MINOR" -lt 23 ]; then | ||
| echo "[rtk] WARNING: rtk $RTK_VERSION is too old (need >= 0.23.0). Upgrade: cargo install rtk" >&2 | ||
| exit 0 | ||
| fi | ||
| fi | ||
|
|
||
| INPUT=$(cat) | ||
| CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty') | ||
|
|
||
| if [ -z "$CMD" ]; then | ||
| exit 0 | ||
| fi | ||
|
|
||
| # Delegate all rewrite + permission logic to the Rust binary. | ||
| REWRITTEN=$(rtk rewrite "$CMD" 2>/dev/null) | ||
| EXIT_CODE=$? | ||
|
|
||
| case $EXIT_CODE in | ||
| 0) | ||
| # Rewrite found, no permission rules matched — safe to auto-allow. | ||
| # If the output is identical, the command was already using RTK. | ||
| [ "$CMD" = "$REWRITTEN" ] && exit 0 | ||
| ;; | ||
| 1) | ||
| # No RTK equivalent — pass through unchanged. | ||
| exit 0 | ||
| ;; | ||
| 2) | ||
| # Deny rule matched — let Claude Code's native deny rule handle it. | ||
| exit 0 | ||
| ;; | ||
| 3) | ||
| # Ask rule matched — rewrite the command but do NOT auto-allow so that | ||
| # Claude Code prompts the user for confirmation. | ||
| ;; | ||
| *) | ||
| exit 0 | ||
| ;; | ||
| esac | ||
|
|
||
| ORIGINAL_INPUT=$(echo "$INPUT" | jq -c '.tool_input') | ||
| UPDATED_INPUT=$(echo "$ORIGINAL_INPUT" | jq --arg cmd "$REWRITTEN" '.command = $cmd') | ||
|
|
||
| if [ "$EXIT_CODE" -eq 3 ]; then | ||
| # Ask: rewrite the command, omit permissionDecision so Claude Code prompts. | ||
| jq -n \ | ||
| --argjson updated "$UPDATED_INPUT" \ | ||
| '{ | ||
| "hookSpecificOutput": { | ||
| "hookEventName": "PreToolUse", | ||
| "updatedInput": $updated | ||
| } | ||
| }' | ||
| else | ||
| # Allow: rewrite the command and auto-allow. | ||
| jq -n \ | ||
| --argjson updated "$UPDATED_INPUT" \ | ||
| '{ | ||
| "hookSpecificOutput": { | ||
| "hookEventName": "PreToolUse", | ||
| "permissionDecision": "allow", | ||
| "permissionDecisionReason": "RTK auto-rewrite", | ||
| "updatedInput": $updated | ||
| } | ||
| }' | ||
| fi | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,15 @@ | ||
| { | ||
| "hooks": { | ||
| "PreToolUse": [ | ||
| { | ||
| "matcher": "Bash", | ||
| "hooks": [ | ||
| { | ||
| "type": "command", | ||
| "command": ".claude/hooks/rtk-rewrite.sh" | ||
| } | ||
| ] | ||
| } | ||
|
Comment on lines
+1
to
+12
|
||
| ] | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,25 @@ | ||||||
| # AGENTS.md — Claw Dev Agent Rules | ||||||
|
|
||||||
| ## Tool Preferences | ||||||
|
|
||||||
| | Task | Use | Not | | ||||||
| |------|-----|-----| | ||||||
| | Project overview | `tokei src/ shared/` | `ls -la` | | ||||||
| | Find files | `fd -e ts src/` | `find src -name "*.ts"` | | ||||||
| | Search content | `rg 'pattern' src/ -t ts` | `grep -r` | | ||||||
| | Structural search | `ast-grep run --lang ts --pattern '...' src/` | complex regex | | ||||||
| | Query JSON | `jq '.key' file.json` | `cat file.json \| grep` | | ||||||
|
||||||
| | Query JSON | `jq '.key' file.json` | `cat file.json \| grep` | | |
| | Query JSON | `jq '.key' file.json` | `cat file.json | grep` | |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,78 @@ | ||||||||||||||||||||||||||||||||||||
| # Claw Dev — Developer Guide | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| ## Supported Providers | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| | Provider | Env Key | Default Model | | ||||||||||||||||||||||||||||||||||||
| |----------|---------|---------------| | ||||||||||||||||||||||||||||||||||||
| | Anthropic | `ANTHROPIC_API_KEY` | `claude-sonnet-4-20250514` | | ||||||||||||||||||||||||||||||||||||
| | OpenAI | `OPENAI_API_KEY` | `gpt-4.1-mini` | | ||||||||||||||||||||||||||||||||||||
| | Gemini | `GEMINI_API_KEY` | `gemini-2.5-flash` | | ||||||||||||||||||||||||||||||||||||
| | Groq | `GROQ_API_KEY` | `openai/gpt-oss-20b` | | ||||||||||||||||||||||||||||||||||||
| | GitHub Copilot | `COPILOT_TOKEN` | `openai/gpt-4.1-mini` | | ||||||||||||||||||||||||||||||||||||
| | z.ai | `ZAI_API_KEY` | `glm-5` | | ||||||||||||||||||||||||||||||||||||
| | Ollama | local | `qwen3` | | ||||||||||||||||||||||||||||||||||||
|
Comment on lines
+3
to
+13
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Provider support table is out of sync with actual runtime support. On Line 5-Line 13, the guide documents OpenAI/Groq/Copilot/z.ai/Ollama as supported, but runtime currently only accepts 🛠️ Proposed doc correction | Provider | Env Key | Default Model |
|----------|---------|---------------|
| Anthropic | `ANTHROPIC_API_KEY` | `claude-sonnet-4-20250514` |
-| OpenAI | `OPENAI_API_KEY` | `gpt-4.1-mini` |
| Gemini | `GEMINI_API_KEY` | `gemini-2.5-flash` |
-| Groq | `GROQ_API_KEY` | `openai/gpt-oss-20b` |
-| GitHub Copilot | `COPILOT_TOKEN` | `openai/gpt-4.1-mini` |
-| z.ai | `ZAI_API_KEY` | `glm-5` |
-| Ollama | local | `qwen3` |📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| Copy `.env.example` to `.env` and fill in your keys. | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| ## Codebase Overview | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| ```bash | ||||||||||||||||||||||||||||||||||||
| tokei src/ shared/ # instant language + line count | ||||||||||||||||||||||||||||||||||||
| ``` | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| ## Recommended Tools | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| All cross-platform (Linux / macOS / Windows). | ||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
| | Tool | Install | Replaces | Gain | | ||||||||||||||||||||||||||||||||||||
| |------|---------|----------|------| | ||||||||||||||||||||||||||||||||||||
| | **rtk** | `curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh \| sh` | — | -60/90% tokens on bash output | | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
| | **rtk** | `curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh \| sh` | — | -60/90% tokens on bash output | | |
| | **rtk** | `curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh` | — | -60/90% tokens on bash output | |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P2: Contributor docs recommend curl | sh from a mutable branch URL, creating avoidable remote code-execution/supply-chain risk.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At CLAUDE.md, line 29:
<comment>Contributor docs recommend `curl | sh` from a mutable branch URL, creating avoidable remote code-execution/supply-chain risk.</comment>
<file context>
@@ -0,0 +1,78 @@
+
+| Tool | Install | Replaces | Gain |
+|------|---------|----------|------|
+| **rtk** | `curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh \| sh` | — | -60/90% tokens on bash output |
+| **rg** | `apt install ripgrep` / `brew install ripgrep` | grep | Fastest content search |
+| **fd** | `apt install fd-find` / `brew install fd` | find | -99% output on targeted search |
</file context>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🌐 Web query:
For Claude Code PreToolUse hooks, is omittingpermissionDecisiontreated as allow/pass-through, and is returningpermissionDecision: "deny"the correct way to enforce a deny decision from a hook?💡 Result:
Yes, omitting permissionDecision (i.e., no JSON output from the PreToolUse hook, just exit 0) is treated as allow/pass-through to the native permission system. Returning permissionDecision: "deny" (in the correct format: {"hookSpecificOutput": {"hookEventName": "PreToolUse", "permissionDecision": "deny", "permissionDecisionReason": "..."} } with exit code 0) is the correct way to enforce a deny decision from a hook.
Citations:
permissionDecision: "deny"ignored for Edit tool — tool executes despite deny anthropics/claude-code#37210RTK deny decision is not enforced in the deny branch.
On Line 60-63, when
EXIT_CODE=2, the script exits with 0 and no output. This is treated as allow/pass-through by Claude Code's permission system. The RTK deny decision is effectively ignored.To enforce the deny, output the correct JSON structure with
permissionDecision: "deny":🔒 Fix to enforce deny outcome
🤖 Prompt for AI Agents