Files
2026-07-13 12:30:54 +08:00

247 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
sidebar_position: 2
_i18n_hash: c5728e8d9970ba12114c782ea0f3f562
---
```
# AIルーターの使い方
AIルーターは、Tianjiサーバー上でOpenAI互換およびAnthropic互換のエンドポイントを提供します:
```bash
https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/<provider>/v1/...
```
`<provider>` セグメントは、ルートで設定したプロバイダーモードに一致している必要があります。
## サポートされるエンドポイント
| プロバイダーセグメント | Chat Completions | Responses | Anthropic Messages |
| --- | --- | --- | --- |
| `openai` | `/openai/v1/chat/completions` | `/openai/v1/responses` | - |
| `deepseek` | `/deepseek/v1/chat/completions` | - | - |
| `anthropic` | `/anthropic/v1/chat/completions` | - | `/anthropic/v1/messages` |
| `openrouter` | `/openrouter/v1/chat/completions` | - | `/openrouter/v1/messages` |
| `custom` | `/custom/v1/chat/completions` | `/custom/v1/responses` | `/custom/v1/messages` |
## OpenAI Chat Completions
OpenAI SDKのベースURL
```bash
https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/openai/v1
```
Node.js:
```js
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.TIANJI_API_KEY,
baseURL:
'https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/openai/v1',
});
const response = await client.chat.completions.create({
model: 'gpt-4o',
messages: [{ role: 'user', content: 'Hello from Tianji AI Router' }],
});
console.log(response.choices[0].message);
```
cURL:
```bash
curl -X POST 'https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/openai/v1/chat/completions' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <YOUR_TIANJI_API_KEY>' \
-d '{
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": "Hello from Tianji AI Router"
}
]
}'
```
## OpenAI Responses
OpenAI SDKのベースURL
```bash
https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/openai/v1
```
Node.js:
```js
import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.TIANJI_API_KEY,
baseURL:
'https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/openai/v1',
});
const response = await client.responses.create({
model: 'gpt-4o',
input: 'Write a short deployment checklist.',
});
console.log(response.output_text);
```
cURL:
```bash
curl -X POST 'https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/openai/v1/responses' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <YOUR_TIANJI_API_KEY>' \
-d '{
"model": "gpt-4o",
"input": "Write a short deployment checklist."
}'
```
## Anthropic Messages
Anthropic SDKのベースURL
```bash
https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/anthropic
```
Node.js:
```js
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: process.env.TIANJI_API_KEY,
baseURL:
'https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/anthropic',
});
const message = await client.messages.create({
model: 'claude-opus-4-20250514',
max_tokens: 1024,
messages: [{ role: 'user', content: 'Hello from Tianji AI Router' }],
});
console.log(message.content);
```
cURL:
```bash
curl -X POST 'https://your-tianji-domain.com/api/ai-router/<workspaceId>/<routerId>/anthropic/v1/messages' \
-H 'Content-Type: application/json' \
-H 'x-api-key: <YOUR_TIANJI_API_KEY>' \
-H 'anthropic-version: 2023-06-01' \
-d '{
"model": "claude-opus-4-20250514",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Hello from Tianji AI Router"
}
]
}'
```
## カスタムプロバイダールート
選択されたAIゲートウェイがカスタムベースURLまたはカスタムモデル名を格納している場合は、`custom` プロバイダーセグメントを使用します。
例:
```bash
/api/ai-router/<workspaceId>/<routerId>/custom/v1/chat/completions
/api/ai-router/<workspaceId>/<routerId>/custom/v1/responses
/api/ai-router/<workspaceId>/<routerId>/custom/v1/messages
```
カスタム上流の詳細はAIゲートウェイに保持されます。AIルーターはルートを選択し、正規化されたリクエストを転送するだけです。
## 推奨ルーティングパターン
### アクティブバックアップ
稼働時間がトラフィック分散よりも重要な場合に使用します。
| Tier | ルート | 重み |
| --- | --- | ---: |
| 1 | プライマリOpenAIゲートウェイ | 100 |
| 2 | OpenRouterゲートウェイ | 100 |
| 3 | カスタムフォールバックゲートウェイ | 100 |
AIルーターは、Tier 1がリトライ可能な失敗を返した場合にのみTier 2を試します。
### 重み付き分割
通常運用でプロバイダー間でトラフィックを共有したい場合に使用します。
| Tier | ルート | 重み |
| --- | --- | ---: |
| 1 | ゲートウェイA | 80 |
| 1 | ゲートウェイB | 20 |
両方のルートは同じティアにあるため、プライマリ/セカンダリの順序はありません。どちらのルートが最初に試されやすいかは、重みによって決まります。
### カナリア移行
新しいプロバイダーをテストする際に使用します。
| Tier | ルート | 重み |
| --- | --- | ---: |
| 1 | 現行プロバイダー | 95 |
| 1 | 新規プロバイダー | 5 |
| 2 | 安定使用フォールバック | 100 |
ログで品質と信頼性を確認した後、モデルト重みを増やします。
## トラブルシューティング
### 使えるAIルーターノードがありません
確認事項:
- ルーターが有効化されていること。
- 少なくとも1つのティアに有効なルートがあること。
- 選択されたAIゲートウェイにモデルAPIキーがまだ格納されていること。
- ルートプロバイダーが呼び出しているエンドポイントをサポートしていること。
### 初回の失敗後にルーターが停止します
AIルーターは、リトライ可能な失敗後にのみ続行します。
ネットワークエラー、タイムアウト、`429``500``502``503`、および`504`はデフォルトでリトライ可能です。プロバイダーが他の一時的な失敗コードを使用している場合は、ルート固有のリトライ可能なステータスコードを追加してください。
### 間違ったモデルが使用されています
両方の場所を確認してください:
- ルート**モデルオーバーライド**。設定されている場合、リクエストの`model`を置き換えます。
- AIゲートウェイカスタムモデル名。`custom`ルートの場合、ゲートウェイがモデルをそのカスタムモデル名に置き換えることがあります。
### リクエストが401または403を返します
ランタイムリクエストでTianji APIキーを使用します。ゲートウェイが独自のプロバイダークレデンシャルを保持している場合、アップストリームプロバイダーキーをAIルーターに送信しないでください。
OpenAI互換エンドポイント用には:
```bash
Authorization: Bearer <YOUR_TIANJI_API_KEY>
```
Anthropic Messagesエンドポイント用には:
```bash
x-api-key: <YOUR_TIANJI_API_KEY>
```
```