anymodel
AnyModel開発スキル — ユニバーサルAIコーディングプロキシです。AnyModelのソースコード(proxy.mjs、cli.mjs、providers/*、site/*、test/*)の作業、プロバイダーやプリセットの追加、プロキシの問題のデバッグ、npmへのデプロイ、またはanymodel.devウェブサイトの修正を行う際に、このスキルを活用してください。ユーザーがAnyModelのアーキテクチャ、プロキシのサニタイゼーション、ツールスキーマの修正、Ollama統合、OpenRouterのルーティング、クライアントブランディング、またはデプロイメントパイプラインについて言及した場合にも対応します。コード、テスト、公開、デプロイまで、AnyModelのライフサイクル全体をカバーします。
description の原文を見る
AnyModel development skill — the universal AI coding proxy. Use this skill whenever working on AnyModel source code (proxy.mjs, cli.mjs, providers/*, site/*, test/*), adding providers or presets, debugging proxy issues, deploying to npm, or modifying the anymodel.dev website. Also activate when the user mentions AnyModel architecture, proxy sanitization, tool schema fixing, Ollama integration, OpenRouter routing, client branding, or the deployment pipeline. Covers the full AnyModel lifecycle: code, test, publish, deploy.
SKILL.md 本文
AnyModel開発スキル
AnyModel に取り組んでいます — 任意のAIモデルを1つのインターフェースで使用できるユニバーサルAIコーディングプロキシです。 このスキルに必要なすべてが含まれています:アーキテクチャ、規約、デプロイメントルール、デバッグガイダンス。
製品アイデンティティ
- 名前: AnyModel(大文字のA、大文字のM — ユーザー向けテキストでは「anymodel」や「Any Model」ではなく)
- パッケージ: npm上の
anymodel - ウェブサイト: https://anymodel.dev
- GitHub (プロキシ): https://github.com/anton-abyzov/anymodel
- GitHub (クライアント): https://github.com/antonoly/claude-code-anymodel
- 作成者: Anton Abyzov(X @aabyzov、YouTube @AntonAbyzov)
- ライセンス: MIT
アーキテクチャ
AnyModel client (cli.js) --> anymodel proxy (:9090) --> OpenRouter / Ollama / OpenAI-compatible
3つのコンポーネント:
- プロキシ (
proxy.mjs) —/v1/messagesをインターセプトするHTTPサーバー、リクエストをサニタイズし、フォーマットを変換して、プロバイダーにルーティング - CLI (
cli.mjs) — プロキシの起動、接続、プリセット管理のエントリーポイント - バンドルクライアント (
cli.js) — バイオレットダイヤモンドキャラクターとAnyModelブランディングが含まれた、修正されたClaude Codeクライアント
3つのプロバイダー
| プロバイダー | ファイル | APIフォーマット | 主な動作 |
|---|---|---|---|
| OpenRouter | providers/openrouter.mjs | Anthropic パススルー | cache_control を保持、300以上のクラウドモデル |
| Ollama | providers/ollama.mjs | OpenAI /v1/chat/completions | num_ctx=8192 を注入、86個すべてのツールを削除 |
| OpenAI | providers/openai.mjs | OpenAI フォーマット | 完全な双方向Anthropic <-> OpenAI翻訳 |
プリセット(変更時はKNOWLEDGE-BASE.mdのバージョンを更新)
| プリセット | モデルID | コスト |
|---|---|---|
| gpt | openai/gpt-5.4 | 有料 |
| codex | openai/gpt-5.3-codex | 有料、コーディング |
| gemini | google/gemini-3.1-flash-lite-preview | 有料 |
| deepseek | deepseek/deepseek-r1-0528 | 有料 |
| mistral | mistralai/devstral-2512 | 有料、コーディング |
| gemma | google/gemma-4-31b-it | 有料、コーディング |
| qwen | qwen/qwen3-coder:free | 無料 |
| nemotron | nvidia/nemotron-3-super-120b-a12b:free | 無料 |
| llama | meta-llama/llama-3.3-70b-instruct:free | 無料 |
新しいプリセットを追加する場合:cli.mjs の MODEL_PRESETS に追加、ヘルプテキストを更新、KNOWLEDGE-BASE.md を更新、site/index.html を更新、README.md を更新します。
プロキシのサニタイゼーション (proxy.mjs)
sanitizeBody() 関数はAnyModelの中核です。任意のモデルがClaude Codeのリクエストフォーマットで機能するようにします。
実行内容(順序):
- Anthropic専用フィールドを削除:
betas、metadata、speed、output_config、context_management thinkingを保持 — 推論モデル(DeepSeek R1)はチェーンオブソートに必要cache_controlを保持 OpenRouter(Anthropicモデルがサポート)、Ollama/OpenAIでは削除max_tokensをクランプ 最小値16 — Claude Codeはプローブでmax_tokens: 1を送信、OpenAI/GPTは16未満を拒否- ツールスキーマを修正:
input_schemaが完全にない ->_unusedプレースホルダーを使用した最小限の有効なスキーマを追加- 空の
properties: {}->_unusedプレースホルダーを追加(OpenAIは空のプロパティを拒否) typeフィールドが欠落 ->"type": "object"を追加- ネストされたスキーマを再帰的に修正(
anyOf、oneOf、allOf、items) - tool_useレスポンスから
_unusedを削除、クライアントが見ないようにする
- Anthropic専用のツールフィールドを削除:
cache_control、defer_loading、eager_input_streaming、strict tool_choiceを正規化: 文字列フォーマットをオブジェクトフォーマットに変換- Ollama: すべての86個のツールを削除 — ローカルモデルはMCPツールを使用できず、スキーマの50Kトークンは30~60秒のオーバーヘッドを追加
- ツールなしで自動再試行 — モデルが「ツール使用をサポートするエンドポイントが見つかりません」を返した場合、ツールを削除して再試行
重要な理由
サニタイゼーションなしでは、MCPツールは非Anthropicモデルで機能しません。Claude Codeは、SlackやFigma、GmailなどのMCPサーバーを含む86個のツール定義をすべてのリクエストで送信します。プロキシはこれらのスキーマがターゲットモデルに対して有効であることを保証し、MCPがプロバイダーを通じてシームレスに機能します。
クライアントアイデンティティ
- キャラクター: バイオレットダイヤモンドテーマ(
diamond-headとdiamond-feetASCIIアート) - 色: ライトバイオレット
rgb(147,130,255)、ANSIフォールバックmagentaBright - ブランディング: 至るところに「AnyModel」(標準Claude Codeではない)。ヒントは「Claude に聞く」ではなく「AnyModel に聞く」
- バージョン:
prepublishOnlyスクリプト経由でnpmパッケージと同期 ANYMODEL_MODEL: クライアントUIにアクティブなモデル名を表示する環境変数
クライアントを変更する場合:バイオレットアイデンティティを決して壊さないでください。ダイヤモンドキャラクターと「AnyModel」ブランディングが、標準Claude Codeと区別されるものです。
環境変数
| 変数 | 目的 |
|---|---|
OPENROUTER_API_KEY | OpenRouter APIキー(主プロバイダー) |
OPENAI_API_KEY | OpenAI互換エンドポイント用APIキー |
OPENAI_BASE_URL | カスタムOpenAI互換プロバイダー用のベースURL |
ANYMODEL_CLIENT | クライアントバイナリへの明示的パス |
ANYMODEL_MODEL | クライアントUIに表示されるモデル名 |
ANYMODEL_TOKEN | リモートプロキシモード用認証トークン |
PROXY_PORT | デフォルトポートのオーバーライド(デフォルト: 9090) |
OLLAMA_NUM_CTX | Ollamaコンテキストサイズ(デフォルト: 8192) |
クライアントディスカバリー (findClient())
npx anymodel が接続するとき、この順序でクライアントを検索します:
ANYMODEL_CLIENT環境変数(明示的パス)cli.mjsの隣のcli.js(npmパッケージにバンドル)- 現在のディレクトリの
cli.js - シブリングリポジトリ(
../claude-code/cli.js、../claude-code-anymodel/cli.js) - ホームディレクトリ(
~/claude-code-anymodel/cli.js) - グローバル
claudeバイナリ(最後の手段フォールバック)
デプロイメントパイプライン(必須)
すべての変更はこのパイプラインに従う必要があります。ステップをスキップしたり、テストに合格せずに発行したりしないでください。
# 1. すべてのテストを実行
node --test test/*.test.mjs
# 2. コミットとプッシュ
git add <changed-files>
git commit -m "change の説明"
git push
# 3. バージョンバンプとnpmへの発行
npm version patch
npm run sync-version # cli.jsのバージョンを同期
npm publish
# 4. ウェブサイトをデプロイ(site/ が変更された場合のみ)
vercel --prod
# 5. クライアントリポを同期(cli.js が変更された場合のみ)
# cli.js をclaude-code-anymodelリポにコピー
package.jsonの prepublishOnly スクリプトはバージョン同期を処理します。npm version patch の後、npm run sync-version を実行してバンドルクライアントのバージョンを更新し、その後 npm publish を実行します。
新しいプロバイダーの追加
- 既存プロバイダーのパターンに従い
providers/newprovider.mjsを作成 - エクスポート:
{ name, transformRequest, transformResponse, buildUrl, getHeaders } cli.mjsに検出ロジックを追加(PROVIDERS配列)- 環境変数ドキュメントを追加
- プロバイダーのフォーマットが異なる場合はツールスキーマ翻訳を処理
test/にテストを追加KNOWLEDGE-BASE.mdを更新- 完全なデプロイメントパイプラインを実行
新しいプリセットの追加
cli.mjsのMODEL_PRESETSに追加showUsage()のヘルプテキストを更新KNOWLEDGE-BASE.mdのプリセット表を更新site/index.htmlのプリセットセクションを更新README.mdを更新- 完全なデプロイメントパイプラインを実行
デバッグガイド
よくある問題
| 症状 | 原因 | 修正 |
|---|---|---|
max_tokens エラー | Claude Codeはプローブで max_tokens: 1 を送信 | プロキシは16にクランプ — sanitizeBody() をチェック |
| GPTでツール使用が失敗 | ツールスキーマで空の properties: {} | プロキシが _unused プレースホルダーを追加 — ツールサニタイゼーションをチェック |
| Ollamaが非常に遅い | 86個のツールスキーマが50Kトークンを追加 | プロキシがツールを削除 — Ollamaプロバイダーをチェック |
| 「エンドポイントが見つかりません」 | モデルがツール使用をサポートしていない | プロキシはツールなしで自動再試行 |
| ストリーミングが中断 | レスポンスフォーマットの不一致 | プロバイダーの transformResponse をチェック — Anthropic SSE対OpenAI SSE |
cache_control エラー | 非Anthropicモデルがキャッシュヒントを拒否 | sanitizeBody() の keepCache フラグをチェック |
| クライアントが「Claude」を表示 | ブランディングが適用されていない | ANYMODEL_MODEL 環境変数とクライアントアイデンティティパッチをチェック |
プロキシトラフィックのデバッグ
プロキシはカラーコード化された出力ですべてのリクエストをログしています:
[OPENROUTER]/[OLLAMA]/[OPENAI]— プロバイダープレフィックスtools=N— リクエスト内のツール数stream=true— ストリーミングモード- イエロー
[OLLAMA] Stripping N tools— ローカルモデルのツール削除 - グリーン
200— 成功したレスポンス - 赤いステータスコード — エラーとボディ抜粋
競争状況
| ツール | AnyModelとの主な違い |
|---|---|
| Claude Code Router (CCR) | 31K以上のスター、Claude Code特有、手動JSONコンフィグが必要、バンドルクライアントなし |
| OpenRouter ネイティブ | Anthropicモデルのみが確実に機能、フォーマット翻訳なし |
| OpenCode | 完全な書き換え(107Kスター)、独自のエコシステム、プロキシではない |
| Cline | VS Code拡張機能、IDE特有、スタンドアロンCLIではない |
| LiteLLM | エンタープライズPythonゲートウェイ、重いコンフィグ |
Anthropic サードパーティカットオフ(2026年4月4日)
Claude購読はサードパーティツールをカバーしなくなりました。AnyModelプロキシモードは影響を受けません(OpenRouterを通じてルーティング、Anthropic OAuthに触れない)。これが重要な売却ポイントです — AnyModelユーザーはClaude購読が不要です。
URL とリンク
| リソース | URL |
|---|---|
| AnyModel ウェブサイト | https://anymodel.dev |
| AnyModel npm | https://npmjs.com/package/anymodel |
| AnyModel GitHub | https://github.com/anton-abyzov/anymodel |
| クライアント GitHub | https://github.com/antonoly/claude-code-anymodel |
| SpecWeave | https://spec-weave.com |
| Verified Skills | https://verified-skill.com |
| OpenRouter キー | https://openrouter.ai/keys |
| YouTubeデモ | https://youtu.be/k0RI_M6lIsg |
| YouTubeチャンネル | https://youtube.com/@AntonAbyzov |
| Twitter/X | https://x.com/aabyzov |
| Discord | https://discord.gg/UYg4BGJ65V |
| Telegram | https://t.me/antonaipower |
ファイル構造
anymodel/
cli.mjs # CLIエントリーポイント
cli.js # バンドルクライアント(12MB修正済みClaude Code)
proxy.mjs # HTTPプロキシサーバー + サニタイゼーション
package.json # npm設定
providers/
openrouter.mjs # OpenRouterプロバイダー(パススルー)
ollama.mjs # Ollamaプロバイダー(OpenAI翻訳 + num_ctx)
openai.mjs # OpenAIプロバイダー(双方向翻訳)
site/
index.html # anymodel.dev ホームページ
styles.css / script.js / sitemap.xml / robots.txt
test/ # 93以上のテスト
KNOWLEDGE-BASE.md # 唯一の情報源(このスキルと同期を保つ)
テスト
すべてのコミット前にすべてのテストを実行します:
node --test test/*.test.mjs
テストは以下をカバーしています:サニタイゼーション、ツールスキーマ修正、プロバイダー翻訳、プリセット解決、max_tokensクランプ、ストリーミング、エラーハンドリング。機能を追加する場合は、対応するテストを追加します。テスト数は増加するだけです。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- anton-abyzov
- ライセンス
- MIT
- 最終更新
- 2026/4/21
Source: https://github.com/anton-abyzov/anymodel / ライセンス: MIT