| # その他ツール統合 |
|
|
| 9RouterはOpenAI API形式をサポートする任意のツールと互換性があります。このガイドでは、様々なツールやカスタムアプリケーション向けの汎用統合パターンを説明します。 |
|
|
| ## 概要 |
|
|
| 9RouterはOpenAI互換APIエンドポイントを提供し、以下と動作します: |
| - カスタムスクリプトとアプリケーション |
| - APIクライアントとテストツール |
| - CLIツールとユーティリティ |
| - サードパーティ統合 |
| - 開発フレームワーク |
|
|
| ## 汎用セットアップパターン |
|
|
| 任意のOpenAI互換ツールは以下の設定で9Routerに接続できます: |
|
|
| **ローカル9Router:** |
| ``` |
| Base URL: http://localhost:20128/v1 |
| API Key: your-api-key-from-dashboard |
| Model: 任意の9Routerモデル (cc/*, cx/*, glm/*など) |
| ``` |
|
|
| **クラウド9Router:** |
| ``` |
| Base URL: https://9router.com/v1 |
| API Key: your-api-key-from-dashboard |
| Model: 任意の9Routerモデル (cc/*, cx/*, glm/*など) |
| ``` |
|
|
| ## 利用可能なモデル |
|
|
| ### Claudeモデル (Anthropic) |
| - `cc/claude-opus-4-5-20251101` |
| - `cc/claude-sonnet-4-20250514` |
| - `cc/claude-haiku-4-20250514` |
|
|
| ### DeepSeekモデル |
| - `cx/deepseek-chat` |
| - `cx/deepseek-reasoner` |
|
|
| ### GLMモデル (Zhipu AI) |
| - `glm/glm-4-plus` |
| - `glm/glm-4-flash` |
|
|
| ## 統合例 |
|
|
| ### PythonとOpenAI SDK |
|
|
| ```python |
| from openai import OpenAI |
| |
| client = OpenAI( |
| api_key="your-api-key-from-dashboard", |
| base_url="http://localhost:20128/v1" |
| ) |
| |
| response = client.chat.completions.create( |
| model="cc/claude-sonnet-4-20250514", |
| messages=[ |
| {"role": "user", "content": "Hello, how are you?"} |
| ] |
| ) |
| |
| print(response.choices[0].message.content) |
| ``` |
|
|
| ### Node.jsとOpenAI SDK |
|
|
| ```javascript |
| import OpenAI from "openai"; |
| |
| const client = new OpenAI({ |
| apiKey: "your-api-key-from-dashboard", |
| baseURL: "http://localhost:20128/v1" |
| }); |
| |
| const response = await client.chat.completions.create({ |
| model: "cc/claude-sonnet-4-20250514", |
| messages: [ |
| { role: "user", content: "Hello, how are you?" } |
| ] |
| }); |
| |
| console.log(response.choices[0].message.content); |
| ``` |
|
|
| ### cURLコマンド |
|
|
| ```bash |
| curl http://localhost:20128/v1/chat/completions \ |
| -H "Content-Type: application/json" \ |
| -H "Authorization: Bearer your-api-key-from-dashboard" \ |
| -d '{ |
| "model": "cc/claude-sonnet-4-20250514", |
| "messages": [ |
| {"role": "user", "content": "Hello, how are you?"} |
| ] |
| }' |
| ``` |
|
|
| ### HTTPクライアント (Postman、Insomnia) |
|
|
| **Request:** |
| ``` |
| POST http://localhost:20128/v1/chat/completions |
| ``` |
|
|
| **Headers:** |
| ``` |
| Content-Type: application/json |
| Authorization: Bearer your-api-key-from-dashboard |
| ``` |
|
|
| **Body:** |
| ```json |
| { |
| "model": "cc/claude-sonnet-4-20250514", |
| "messages": [ |
| {"role": "user", "content": "Hello, how are you?"} |
| ], |
| "temperature": 0.7, |
| "max_tokens": 1000 |
| } |
| ``` |
|
|
| ### LangChain統合 |
|
|
| ```python |
| from langchain.chat_models import ChatOpenAI |
| from langchain.schema import HumanMessage |
| |
| llm = ChatOpenAI( |
| model_name="cc/claude-sonnet-4-20250514", |
| openai_api_key="your-api-key-from-dashboard", |
| openai_api_base="http://localhost:20128/v1", |
| temperature=0.7 |
| ) |
| |
| messages = [HumanMessage(content="Explain quantum computing")] |
| response = llm(messages) |
| print(response.content) |
| ``` |
|
|
| ### LlamaIndex統合 |
|
|
| ```python |
| from llama_index.llms import OpenAI |
| |
| llm = OpenAI( |
| model="cc/claude-sonnet-4-20250514", |
| api_key="your-api-key-from-dashboard", |
| api_base="http://localhost:20128/v1" |
| ) |
| |
| response = llm.complete("What is machine learning?") |
| print(response.text) |
| ``` |
|
|
| ## カスタムスクリプトの例 |
|
|
| ### バッチ処理スクリプト |
|
|
| ```python |
| import openai |
| import json |
| |
| openai.api_key = "your-api-key-from-dashboard" |
| openai.api_base = "http://localhost:20128/v1" |
| |
| def process_batch(prompts, model="cx/deepseek-chat"): |
| results = [] |
| for prompt in prompts: |
| response = openai.ChatCompletion.create( |
| model=model, |
| messages=[{"role": "user", "content": prompt}] |
| ) |
| results.append({ |
| "prompt": prompt, |
| "response": response.choices[0].message.content |
| }) |
| return results |
| |
| prompts = [ |
| "Explain AI in one sentence", |
| "What is machine learning?", |
| "Define neural networks" |
| ] |
| |
| results = process_batch(prompts) |
| print(json.dumps(results, indent=2)) |
| ``` |
|
|
| ### ストリーミングレスポンスハンドラ |
|
|
| ```javascript |
| import OpenAI from "openai"; |
| |
| const client = new OpenAI({ |
| apiKey: "your-api-key-from-dashboard", |
| baseURL: "http://localhost:20128/v1" |
| }); |
| |
| async function streamResponse(prompt) { |
| const stream = await client.chat.completions.create({ |
| model: "cc/claude-sonnet-4-20250514", |
| messages: [{ role: "user", content: prompt }], |
| stream: true |
| }); |
| |
| for await (const chunk of stream) { |
| const content = chunk.choices[0]?.delta?.content || ""; |
| process.stdout.write(content); |
| } |
| } |
| |
| streamResponse("Write a short story about AI"); |
| ``` |
|
|
| ### マルチモデル比較 |
|
|
| ```python |
| from openai import OpenAI |
| |
| client = OpenAI( |
| api_key="your-api-key-from-dashboard", |
| base_url="http://localhost:20128/v1" |
| ) |
| |
| models = [ |
| "cc/claude-sonnet-4-20250514", |
| "cx/deepseek-chat", |
| "glm/glm-4-plus" |
| ] |
| |
| prompt = "Explain quantum computing in simple terms" |
| |
| for model in models: |
| response = client.chat.completions.create( |
| model=model, |
| messages=[{"role": "user", "content": prompt}] |
| ) |
| print(f"\n=== {model} ===") |
| print(response.choices[0].message.content) |
| ``` |
|
|
| ## 一般的な統合パターン |
|
|
| ### 環境変数 |
|
|
| 認証情報を安全に保存: |
|
|
| ```bash |
| # .envファイル |
| ROUTER_API_KEY=your-api-key-from-dashboard |
| ROUTER_BASE_URL=http://localhost:20128/v1 |
| ROUTER_MODEL=cc/claude-sonnet-4-20250514 |
| ``` |
|
|
| ```python |
| import os |
| from openai import OpenAI |
| |
| client = OpenAI( |
| api_key=os.getenv("ROUTER_API_KEY"), |
| base_url=os.getenv("ROUTER_BASE_URL") |
| ) |
| ``` |
|
|
| ### エラーハンドリング |
|
|
| ```python |
| from openai import OpenAI, OpenAIError |
| |
| client = OpenAI( |
| api_key="your-api-key", |
| base_url="http://localhost:20128/v1" |
| ) |
| |
| try: |
| response = client.chat.completions.create( |
| model="cc/claude-sonnet-4-20250514", |
| messages=[{"role": "user", "content": "Hello"}] |
| ) |
| print(response.choices[0].message.content) |
| except OpenAIError as e: |
| print(f"Error: {e}") |
| ``` |
|
|
| ### リトライロジック |
|
|
| ```python |
| import time |
| from openai import OpenAI, RateLimitError |
| |
| client = OpenAI( |
| api_key="your-api-key", |
| base_url="http://localhost:20128/v1" |
| ) |
| |
| def chat_with_retry(prompt, max_retries=3): |
| for attempt in range(max_retries): |
| try: |
| response = client.chat.completions.create( |
| model="cc/claude-sonnet-4-20250514", |
| messages=[{"role": "user", "content": prompt}] |
| ) |
| return response.choices[0].message.content |
| except RateLimitError: |
| if attempt < max_retries - 1: |
| time.sleep(2 ** attempt) # Exponential backoff |
| else: |
| raise |
| ``` |
|
|
| ## トラブルシューティング |
|
|
| ### 接続の問題 |
|
|
| **問題:** 9Routerに接続できない |
| ```bash |
| # 9Routerが動作中か確認 |
| curl http://localhost:20128/health |
| |
| # 期待されるレスポンス: |
| {"status": "ok"} |
| ``` |
|
|
| **解決策:** |
| - 9Routerが動作中か確認 |
| - ポート20128がブロックされていないか確認 |
| - 正しいbase URLを確認 (`/v1`を含む) |
|
|
| ### 認証エラー |
|
|
| **問題:** 401 Unauthorized |
| ``` |
| Error: Invalid API key |
| ``` |
|
|
| **解決策:** |
| - ダッシュボードからのAPIキーを確認 |
| - AuthorizationヘッダーフォーマットがBearer your-api-keyであることを確認 |
| - APIキーに余分なスペースや改行がないことを確認 |
|
|
| ### モデルが見つからない |
|
|
| **問題:** 404 Model not found |
| ``` |
| Error: Model 'cc/claude-opus' not found |
| ``` |
|
|
| **解決策:** |
| - 正確なモデル名を使用 (大文字小文字を区別) |
| - 利用可能なモデルを確認: `curl http://localhost:20128/v1/models` |
| - プランでモデルが有効になっていることを確認 |
|
|
| ### タイムアウトの問題 |
|
|
| **問題:** リクエストタイムアウト |
| ``` |
| Error: Request timed out after 30s |
| ``` |
|
|
| **解決策:** |
| - クライアント設定でタイムアウトを増やす |
| - 時間制約のあるタスクには高速モデルを使用 |
| - 9Routerへのネットワーク接続を確認 |
|
|
| ### レート制限 |
|
|
| **問題:** 429 Too Many Requests |
| ``` |
| Error: Rate limit exceeded |
| ``` |
|
|
| **解決策:** |
| - 指数バックオフを実装 |
| - リクエスト頻度を減らす |
| - ダッシュボードでレート制限を確認 |
| - プランのアップグレードを検討 |
|
|
| ## ベストプラクティス |
|
|
| ### セキュリティ |
| - APIキーを環境変数に保存 |
| - APIキーをバージョン管理にコミットしない |
| - クラウドデプロイにはHTTPSを使用 |
| - APIキーを定期的にローテーション |
|
|
| ### パフォーマンス |
| - タスクの複雑さに応じて適切なモデルを使用 |
| - 繰り返しクエリにキャッシュを実装 |
| - 長い応答にはストリーミングを使用 |
| - 可能な場合はリクエストをバッチ処理 |
|
|
| ### エラーハンドリング |
| - 常にtry-catchブロックを実装 |
| - 指数バックオフでリトライロジックを追加 |
| - デバッグのためエラーをログ |
| - フォールバックメカニズムを提供 |
|
|
| ### コスト最適化 |
| - シンプルなタスクには費用対効果の高いモデルを選択 |
| - 適切な場合は応答をキャッシュ |
| - ダッシュボードで使用量をモニター |
| - コードでリクエスト制限を設定 |
|
|
| ## 次のステップ |
|
|
| - [Cursorを設定](cursor.md) IDE統合用 |
| - [Continueをセットアップ](continue.md) VSCode用 |
| - [CLI使用法を確認](../cli/basic-usage.md) |
| - [モデル選択について学ぶ](../models/overview.md) |
| - [APIリファレンス](../api/reference.md) |
|
|