2026年3月24日火曜日

launching an instance of Claude Code using my local LLM

 #!/usr/bin/env bash

# lcc - Local Claude Code launcher
# Points Claude Code at a local LLM served by llama.cpp on your GB10 device
#
# Usage:
#   lcc <modelname>           — launch Claude Code with the specified model
#   lcc <modelname> [args]    — pass additional arguments to claude
#   lcc                       — show help/launch with model if one is available
#
# Prerequisites:
#   - Claude Code installed
#   - LLM provider with Anthropic Messages API support
#   - jq (for model auto-detection)
#
#
# Configuration: change if needed:
LCC_HOST="${LCC_HOST:-192.168.1.179}" # This is my server IP, you should change to your most commonly used
LCC_PORT="${LCC_PORT:-8000}"
LCC_BASE_URL="http://${LCC_HOST}:${LCC_PORT}"
# ANSI color codes
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m'
BOLD='\033[1m'
# No model argument, show help and check server
if [[ -z "$1" ]]; then
    echo -e "${BOLD}Local Claude Code${NC} (${CYAN}GB10 @ ${LCC_HOST}:${LCC_PORT}${NC})"
    echo ""
    # Check if server is reachable
    if curl -sf "${LCC_BASE_URL}/health" > /dev/null 2>&1; then
        echo -e "${GREEN} llama-server is running${NC}"
        # Try to get the loaded model name from /v1/models
        MODEL_INFO=$(curl -sf "${LCC_BASE_URL}/v1/models" 2>/dev/null)
        if [[ -n "$MODEL_INFO" ]]; then
            # Check for jq
            if ! command -v jq &>/dev/null; then
                echo ""
                echo -e "${YELLOW} jq not found; install it for model auto-detection${NC}"
            else
                echo ""
                echo -e "${WHITE}Loaded model(s):${NC}"
                MODEL_COUNT=$(echo "$MODEL_INFO" | jq '.data | length')
                # Store models in an array
                MODELS=()
                while IFS= read -r line; do
                    MODELS+=("$line")
                done < <(echo "$MODEL_INFO" | jq -r '.data[].id')
                # Print models with numbering
                for i in "${!MODELS[@]}"; do
                    if [[ "$MODEL_COUNT" -eq 1 ]]; then
                        echo -e "  ${GREEN}${NC} ${BOLD}${MODELS[$i]}${NC}"
                    else
                        echo -e "  ${WHITE}$((i+1)).${NC} ${MODELS[$i]}"
                    fi
                done
                # If exactly one model, use it
                if [[ "$MODEL_COUNT" -eq 1 ]]; then
                    MODEL="${MODELS[0]}"
                    echo ""
                    echo -e "${CYAN}Automatic model selection:${NC} Using ${BOLD}${MODEL}${NC}"
                    echo ""
                    echo -e "${GREEN} Launching Claude Code...${NC}"
                    export ANTHROPIC_BASE_URL="${LCC_BASE_URL}"
                    export ANTHROPIC_AUTH_TOKEN="local"
                    export ANTHROPIC_API_KEY=""
                    export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
                    exec claude --model "$MODEL" "$@"
                fi
            fi
        fi
    else
        echo -e "${RED} Cannot reach llama-server at ${LCC_BASE_URL}${NC}"
        echo ""
        echo ""
        echo -e "${WHITE}Make sure you're using an LLM provider that supports${NC}"
        echo -e "  ${CYAN}the Anthropic Messages API (/v1/messages endpoint)${NC}"
    fi
    echo ""
    echo -e "${WHITE}Examples:${NC}"
    echo -e "  ${GREEN}lcc qwen3-coder${NC}"
    echo -e "  ${GREEN}lcc my-model -p${NC} # pass extra flags to claude"
    echo ""
    echo -e "${WHITE}Override host/port:${NC}"
    echo -e "  ${CYAN}LCC_HOST=10.0.0.5 LCC_PORT=9090 lcc mymodel${NC}"
    exit 0
fi
# Launch Claude Code with the specified model
MODEL="$1"
shift  # remaining args pass through to claude
echo -e "${GREEN}Launching${NC} ${BOLD}Claude Code${NC} ${CYAN}${LCC_HOST}:${LCC_PORT}${NC} / ${MAGENTA}${BOLD}${MODEL}${NC}"
export ANTHROPIC_BASE_URL="${LCC_BASE_URL}"
export ANTHROPIC_AUTH_TOKEN="local"
export ANTHROPIC_API_KEY=""
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
exec claude --model "$MODEL" "$@"

2026年3月23日月曜日

Claudeの利用制限に悩む人必見:上限に引っかかりにくくなる4つの使い方の工夫

はじめに

Claude(Anthropic社製LLM)を日常的に使い込んでいると、「Usage limit reached」というメッセージに直面した経験を持つエンジニアは多いはずだ。特にClaudeのProプランやAPI利用においては、1日あたりのメッセージ数・トークン数に上限が設けられており、長大なコンテキストを多用するコーディング支援やドキュメント生成のワークフローでは、思わぬ早さで上限に到達することがある。

Anthropicの公式ドキュメントによれば、APIのレート制限はリクエスト数(RPM)・トークン数(TPM)・1日あたりのトークン数(TPD)の3軸で管理されており、使用状況に応じて自動的に調整される仕組みになっている [Source: https://docs.anthropic.com/en/api/rate-limits]。

本稿では、この制限に引っかかりにくくするための4つの実践的な工夫を、技術的な観点から解説する。


工夫1:プロンプトを圧縮し、不要なコンテキストを排除する

最も即効性の高い対策は、1回のリクエストあたりの入力トークン数を削減することだ。「なんとなく前の会話を丸ごとコピーして貼り付ける」という使い方は、トークンを急速に消費する典型的なアンチパターンである。

具体的には以下の点を意識する。

  • システムプロンプトの最小化:役割定義や制約事項は簡潔に書く。冗長な説明は省略する。
  • コードの部分的な提示:コードレビューを依頼する際は、ファイル全体ではなく問題のある関数や差分(diff)のみを渡す。
  • 会話履歴のトリミング:長い会話では、初期の文脈を適宜要約して1つのメッセージに圧縮してからセッションを再開する。

Anthropicのプロンプトエンジニアリングガイドでも、「明確かつ直接的な指示がモデルのパフォーマンスとコスト効率の両方を改善する」と明記されている [Source: https://docs.anthropic.com/en/docs/build-with-claude/prompt-engineering/overview]。トークン削減はコスト削減だけでなく、モデルの推論精度向上にも直結する。


工夫2:Projectsを活用してセッションをまたいだコンテキストを共有する

ClaudeのProプランには「Projects」機能が搭載されており、プロジェクト単位でカスタム指示(System Prompt相当)やドキュメントを保持できる。この機能を使いこなすことで、毎回同じ背景情報をプロンプトに貼り付けるという非効率を排除できる。

例えば、特定のリポジトリのコーディング規約や設計方針をProjectsに一度登録しておけば、個々の会話でその情報を繰り返し入力する必要がなくなる。結果として、1回のやり取りで渡すトークン量を大幅に削減でき、実質的な「会話密度」が向上する。

Projectsは単なる便利機能ではなく、トークンバジェット管理の観点からも有効なアーキテクチャ上の選択肢だ。大規模なコンテキストを繰り返し送信するのではなく、プロジェクト側で管理することで、1日あたりのトークン消費を平準化できる。


工夫3:タスクを細分化し、1回の会話で「詰め込みすぎ」を避ける

「1回のメッセージで全部やってもらおう」という発想は、長い出力を生成させることになり、出力トークンも大量に消費する。制限に優しいアプローチは、タスクを意味のある単位に分解し、複数の短い会話に分散させることだ。

例: - 悪い例:「このAPIの設計から実装、テストコード、ドキュメントまで全部作って」 - 良い例:最初の会話でAPI設計のみをレビュー → 次の会話で実装 → 別の会話でテストコード生成

この「分割統治」アプローチは、利用制限の回避だけでなく、出力品質の向上にも貢献する。モデルが一度に処理する範囲が小さくなるほど、各ステップでの推論精度が上がりやすい。また、中間成果物を人間がレビューする機会が生まれるため、エラーの早期発見にもつながる。


工夫4:モデルを使い分け、重い処理を必要な場面だけに絞る

AnthropicはClaude 3シリーズ以降、Haiku・Sonnet・Opusといった異なるサイズのモデルを提供している。API利用者にとっては、タスクの複雑さに応じてモデルを使い分けることが、レート制限とコストの両方を最適化する上で不可欠な戦略だ [Source: https://docs.anthropic.com/en/docs/about-claude/models/overview]。

具体的な使い分けの目安:

タスク種別 推奨モデル
定型的なテキスト分類・要約 Claude Haiku
コードレビュー・中程度の推論 Claude Sonnet
複雑なアーキテクチャ設計・高度な推論 Claude Opus

UIを通じたProプラン利用者の場合、デフォルトのモデル選択に依存せず、タスクの性質に応じて意識的にモデルを切り替える習慣をつけることが重要だ。軽量タスクにOpusを使い続けることは、制限到達を早めるだけでなく、レスポンス速度の観点からも非効率である。


まとめ:制限との付き合い方はワークフロー設計の問題

Claude の利用制限は、単なる「使いすぎへのペナルティ」ではなく、インフラコストとサービス品質を維持するための合理的な仕組みだ。制限に頻繁に引っかかるということは、ワークフロー設計を見直すサインでもある。

本稿で紹介した4つの工夫をまとめると:

  1. プロンプトの圧縮:入力トークンを削減し、1リクエストあたりのコストを下げる
  2. Projectsの活用:繰り返し入力するコンテキストをプロジェクトレベルで管理する
  3. タスクの細分化:1回の会話に詰め込まず、出力トークンの総量を分散させる
  4. モデルの使い分け:タスク複雑度に応じて最適なモデルを選択し、重い処理を必要な場面に限定する

これらは個別のテクニックではなく、LLMを実業務に組み込む際の設計原則として捉えると、より応用範囲が広がる。AIエージェント技術が成熟し、Claudeのような高性能モデルが日常的なツールとなった今、「いかにモデルと効率よく対話するか」というスキルは、エンジニアの基礎リテラシーとして定着しつつある。

API利用者であれば、Anthropicが提供するトークン使用量のモニタリング機能を活用し、自分のワークフローのどの部分でトークンが消費されているかを定期的に確認することも習慣化したい。制限との上手な付き合い方は、結果的にLLM活用の費用対効果を最大化することに直結する。


Category: LLM | Tags: Claude, Anthropic, LLM活用, プロンプトエンジニアリング, AIエージェント