Feat : Gitbook
This commit is contained in:
416
gitbook/content/ja/integration/other-tools.md
Normal file
416
gitbook/content/ja/integration/other-tools.md
Normal file
@@ -0,0 +1,416 @@
|
||||
# その他ツール統合
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user