> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arouter.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# API Reference

> ARouter API 的完整參考文件。所有提供商的請求和回應結構均已統一規範，您只需學習一套介面。

ARouter 的請求和回應結構與 OpenAI Chat API 非常相似，有少量差異。ARouter 對所有模型和提供商的結構進行了統一規範，您只需學習一套即可。

## OpenAPI 規範

完整的 ARouter API 使用 OpenAPI 規範進行了文件化：

* YAML：[https://api.arouter.ai/api-reference/openapi.yaml](/api-reference/openapi.yaml)

ARouter 目前發布 YAML 規範。您可以使用 [Swagger UI](https://swagger.io/tools/swagger-ui/) 或 [Postman](https://www.postman.com/) 等工具來瀏覽 API 或生成客戶端程式庫。

## Base URL

```
https://api.arouter.ai
```

## 認證

所有端點（`/healthz` 除外）都需要透過以下方式之一進行認證：

| 方式             | Header / 參數                   | 使用場景              |
| -------------- | ----------------------------- | ----------------- |
| Bearer Token   | `Authorization: Bearer <key>` | OpenAI SDK、大多數客戶端 |
| API Key Header | `X-Api-Key: <key>`            | Anthropic SDK     |
| 查詢參數           | `?key=<key>`                  | Gemini SDK        |

詳情請參閱[認證指南](/zh-Hant/authentication)。

## 請求

### 請求格式

以下是以 TypeScript 類型表示的請求結構。這將是您向 `/v1/chat/completions` 端點發起 `POST` 請求時的請求體。

完整參數列表請參閱[參數](/zh-Hant/api-reference/parameters)參考文件。

```typescript theme={null}
type Request = {
  // ARouter standardizes chat requests on "messages"
  messages?: Message[];

  // If "model" is unspecified, defaults to the tenant's configured default
  model?: string; // e.g. "openai/gpt-5.4" or "anthropic/claude-sonnet-4.6"

  // Force the model to produce specific output format.
  // See "Structured Outputs" guide for supported models.
  response_format?: ResponseFormat;

  stop?: string | string[];
  stream?: boolean; // Enable streaming

  // See Parameters reference
  max_tokens?: number; // Range: [1, context_length)
  temperature?: number; // Range: [0, 2]

  // Tool calling
  // Passed through to providers implementing OpenAI's interface.
  // For providers with custom interfaces, transformed accordingly.
  tools?: Tool[];
  tool_choice?: ToolChoice;
  parallel_tool_calls?: boolean; // Default: true

  // Advanced optional parameters
  seed?: number;
  top_p?: number; // Range: (0, 1]
  top_k?: number; // Range: [1, Infinity) — not available for OpenAI models
  frequency_penalty?: number; // Range: [-2, 2]
  presence_penalty?: number; // Range: [-2, 2]
  repetition_penalty?: number; // Range: (0, 2]
  logit_bias?: { [key: number]: number };
  top_logprobs?: number;
  min_p?: number; // Range: [0, 1]
  top_a?: number; // Range: [0, 1]

  // Reduce latency by providing a predicted output
  prediction?: { type: 'content'; content: string };

  // ARouter routing parameters
  models?: string[]; // Ordered candidate model list — see Model Routing guide
  route?: string;    // Routing mode used with models[]

  // A stable identifier for your end-users (for abuse detection)
  user?: string;
};
```

ARouter 的 OpenAI 相容聊天端點以 `messages` 為標準。如果您想發送提供商的原生請求體，請使用該提供商的原生端點或[提供商代理](/zh-Hant/guides/provider-proxy)。

### 訊息類型

```typescript theme={null}
type TextContent = {
  type: 'text';
  text: string;
};

type ImageContentPart = {
  type: 'image_url';
  image_url: {
    url: string; // URL or base64 encoded image data
    detail?: string; // Optional, defaults to "auto"
  };
};

type ContentPart = TextContent | ImageContentPart;

type Message =
  | {
      role: 'user' | 'assistant' | 'system';
      // ContentParts are only for the "user" role:
      content: string | ContentPart[];
      // If "name" is included, it will be prepended like this
      // for non-OpenAI models: `{name}: {content}`
      name?: string;
    }
  | {
      role: 'tool';
      content: string;
      tool_call_id: string;
      name?: string;
    };
```

### 工具類型

```typescript theme={null}
type FunctionDescription = {
  description?: string;
  name: string;
  parameters: object; // JSON Schema object
};

type Tool = {
  type: 'function';
  function: FunctionDescription;
};

type ToolChoice =
  | 'none'
  | 'auto'
  | 'required'
  | {
      type: 'function';
      function: {
        name: string;
      };
    };
```

### 結構化輸出

`response_format` 參數強制模型回傳結構化 JSON 回應。ARouter 支援兩種模式：

* `{ type: 'json_object' }`：基本 JSON 模式 — 模型回傳有效的 JSON
* `{ type: 'json_schema', json_schema: { ... } }`：嚴格模式 — 模型回傳符合您精確結構的 JSON

```typescript theme={null}
type ResponseFormat =
  | { type: 'json_object' }
  | {
      type: 'json_schema';
      json_schema: {
        name: string;
        strict?: boolean;
        schema: object; // JSON Schema object
      };
    };
```

詳細用法和範例請參閱[結構化輸出](/zh-Hant/guides/features/structured-outputs)。

使用 JSON 模式時，您仍應在系統或使用者訊息中指示模型以 JSON 格式回應。

### 可選請求 Header

ARouter 支援以下可選 header 來識別您的應用程式：

* `HTTP-Referer`：您的應用程式 URL，用於在控制台中進行來源追蹤
* `X-Title`：您的應用程式顯示名稱，用於 ARouter 分析

```typescript theme={null}
fetch('https://api.arouter.ai/v1/chat/completions', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer lr_live_xxxx',
    'HTTP-Referer': 'https://myapp.com', // Optional
    'X-Title': 'My AI App',             // Optional
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'openai/gpt-5.4',
    messages: [{ role: 'user', content: 'Hello!' }],
  }),
});
```

詳情請參閱[請求歸因](/zh-Hant/guides/request-attribution)。

### 模型路由

使用 `provider/model` 格式指定模型。ARouter 解析提供商前綴並路由到正確的上游。

如果省略 `model` 參數，將使用租戶設定的預設模型。完整路由邏輯請參閱[模型路由](/zh-Hant/model-routing)指南，包括使用 `models[]` 和 `route` 的有序候選模型列表。

### 串流傳輸

設定 `stream: true` 可透過 Server-Sent Events 逐 Token 接收回應。SSE 串流除 `data:` 負載外還可包含註解行，客戶端應忽略這些註解。SSE 格式、用量區塊、取消和錯誤處理請參閱[串流傳輸](/zh-Hant/guides/streaming)指南。

### 非標準參數

如果所選模型不支援某個請求參數（例如非 OpenAI 模型中的 `logit_bias`，或 OpenAI 的 `top_k`），該參數將被靜默忽略。其餘參數將轉發給上游模型 API。

### 助理預填充

ARouter 支援讓模型補全部分回應。在 `messages` 陣列末尾新增一條 `role: "assistant"` 的訊息：

```typescript theme={null}
fetch('https://api.arouter.ai/v1/chat/completions', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer lr_live_xxxx',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: 'openai/gpt-5.4',
    messages: [
      { role: 'user', content: 'What is the meaning of life?' },
      { role: 'assistant', content: "I'm not sure, but my best guess is" },
    ],
  }),
});
```

## 回應

### 回應格式

ARouter 對所有模型和提供商的結構進行了統一規範，以符合 OpenAI Chat API 標準。

`choices` 始終是一個陣列。如果請求了串流傳輸，每個 choice 包含 `delta` 屬性；否則包含 `message` 屬性。

```typescript theme={null}
type Response = {
  id: string;
  choices: (NonStreamingChoice | StreamingChoice)[];
  created: number; // Unix timestamp
  model: string;   // The model that was actually used (e.g. "openai/gpt-5.4")
  object: 'chat.completion' | 'chat.completion.chunk';
  provider?: string; // The upstream provider that handled the request

  system_fingerprint?: string; // Only present if the provider supports it

  // Usage data is always returned for non-streaming.
  // When streaming, usage is returned exactly once in the final chunk,
  // before the [DONE] message, with an empty choices array.
  usage?: ResponseUsage;
};
```

### Choice 類型

```typescript theme={null}
type NonStreamingChoice = {
  finish_reason: string | null; // Normalized finish reason
  native_finish_reason: string | null; // Raw finish reason from the provider
  message: {
    content: string | null;
    role: string;
    tool_calls?: ToolCall[];
  };
  error?: ErrorResponse;
};

type StreamingChoice = {
  finish_reason: string | null;
  native_finish_reason: string | null;
  delta: {
    content: string | null;
    role?: string;
    tool_calls?: ToolCall[];
  };
  error?: ErrorResponse;
};

type ToolCall = {
  id: string;
  type: 'function';
  function: {
    name: string;
    arguments: string; // JSON string
  };
};

type ErrorResponse = {
  code: number;
  message: string;
  metadata?: Record<string, unknown>;
};
```

### 用量

```typescript theme={null}
type ResponseUsage = {
  /** Including images and tools if any */
  prompt_tokens: number;
  /** The tokens generated */
  completion_tokens: number;
  /** Sum of the above two fields */
  total_tokens: number;

  /** Breakdown of prompt tokens */
  prompt_tokens_details?: {
    cached_tokens: number;        // Tokens read from cache (cache hit)
    cache_write_tokens?: number;  // Tokens written to cache
    audio_tokens?: number;        // Tokens used for input audio
  };

  /** Breakdown of completion tokens */
  completion_tokens_details?: {
    reasoning_tokens?: number;              // Tokens generated for reasoning
    accepted_prediction_tokens?: number;    // Accepted predicted output tokens
    rejected_prediction_tokens?: number;    // Rejected predicted output tokens
    audio_tokens?: number;                  // Tokens generated for audio output
    image_tokens?: number;                  // Tokens generated for image output
  };
};
```

### 回應範例

```json theme={null}
{
  "id": "chatcmpl-xxxxxxxxxxxxxx",
  "choices": [
    {
      "finish_reason": "stop",
      "native_finish_reason": "stop",
      "message": {
        "role": "assistant",
        "content": "Hello there!"
      }
    }
  ],
  "usage": {
    "prompt_tokens": 10,
    "completion_tokens": 4,
    "total_tokens": 14,
    "prompt_tokens_details": {
      "cached_tokens": 0
    },
    "completion_tokens_details": {
      "reasoning_tokens": 0
    }
  },
  "model": "openai/gpt-5.4",
  "provider": "openai",
  "object": "chat.completion",
  "created": 1748000000
}
```

### 結束原因

ARouter 將每個模型的 `finish_reason` 統一規範為以下值之一：

| 值                | 描述                 |
| ---------------- | ------------------ |
| `stop`           | 模型自然完成             |
| `length`         | 達到 `max_tokens` 限制 |
| `tool_calls`     | 模型需要呼叫工具           |
| `content_filter` | 內容審核觸發             |
| `error`          | 生成過程中發生錯誤          |

上游提供商的原始結束原因可透過 `native_finish_reason` 取得。

## 端點群組

<CardGroup cols={2}>
  <Card title="OpenAI 相容" icon="bolt" href="/zh-Hant/api-reference/openai/create-chat-completion">
    `/v1/chat/completions`, `/v1/embeddings`, `/v1/models`

    可與任何 OpenAI 相容 SDK 配合使用。支援 `provider/model` 路由。
  </Card>

  <Card title="Anthropic 原生" icon="brain" href="/zh-Hant/api-reference/anthropic/create-message">
    `/v1/messages`, `/v1/messages/batches`, `/v1/messages/count_tokens`

    與 Anthropic SDK 直接相容。
  </Card>

  <Card title="Gemini 原生" icon="wand-magic-sparkles" href="/zh-Hant/api-reference/gemini/generate-content">
    `/v1beta/models/{model}:generateContent`

    與 Google Gemini SDK 直接相容。
  </Card>

  <Card title="API Key 管理" icon="key" href="/zh-Hant/api-reference/keys/create-key">
    `/api/v1/keys`

    建立、列出、更新和刪除 API key。
  </Card>

  <Card title="帳單" icon="credit-card" href="/zh-Hant/api-reference/billing/get-balance">
    `/api/v1/balance`, `/api/v1/transactions`

    查詢帳戶餘額和交易歷史。
  </Card>

  <Card title="提供商代理" icon="arrow-right-arrow-left" href="/zh-Hant/api-reference/proxy/proxy-provider-request">
    `/{provider}/{path}`

    將請求直接代理到任何受支援的提供商。
  </Card>
</CardGroup>

## 速率限制

速率限制按 API key 套用。預設限制可透過控制台或管理 API 按 key 自訂。

| Header                  | 描述                |
| ----------------------- | ----------------- |
| `X-RateLimit-Limit`     | 每個視窗期的最大請求數       |
| `X-RateLimit-Remaining` | 剩餘請求數             |
| `X-RateLimit-Reset`     | 視窗期重置時間（Unix 時間戳） |

## 錯誤回應

所有錯誤均遵循統一的 JSON 格式：

```json theme={null}
{
  "error": {
    "message": "description of what went wrong",
    "type": "error_type"
  }
}
```

完整的錯誤代碼和重試策略請參閱[錯誤處理](/zh-Hant/guides/error-handling)指南。
