axonhub / docs /zh /api-reference /openai-api.md
llzai's picture
Upload 1793 files
9853396 verified
# OpenAI API 参考
## 概述
AxonHub 完全支持 OpenAI API 规范,允许您使用任何 OpenAI 兼容的客户端 SDK 访问多个提供商的模型。
## 核心优势
- **API 互操作性**:使用 OpenAI Chat Completions API 调用 Anthropic、Gemini 和其他支持的模型
- **零代码变更**:继续使用现有的 OpenAI 客户端 SDK,无需修改
- **自动转换**:AxonHub 在需要时自动在 API 格式之间进行转换
- **提供商灵活性**:使用 OpenAI API 格式访问任何支持的 AI 提供商
## 支持的端点
### OpenAI Chat Completions API
**端点:**
- `POST /v1/chat/completions` - 文本生成
- `GET /v1/models` - 列出可用模型
**示例请求:**
```go
import (
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
)
// 使用 AxonHub 配置创建 OpenAI 客户端
client := openai.NewClient(
option.WithAPIKey("your-axonhub-api-key"),
option.WithBaseURL("http://localhost:8090/v1"),
)
// 使用 OpenAI API 格式调用 Anthropic 模型
completion, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage("Hello, Claude!"),
},
Model: openai.ChatModel("claude-3-5-sonnet"),
},
option.WithHeader("AH-Trace-Id", "trace-example-123"),
option.WithHeader("AH-Thread-Id", "thread-example-abc"))
if err != nil {
// 适当处理错误
panic(err)
}
// 访问响应内容
responseText := completion.Choices[0].Message.Content
fmt.Println(responseText)
```
### OpenAI Responses API
AxonHub 提供对 OpenAI Responses API 的部分支持。该 API 为单轮交互提供了简化的接口。
**端点:**
- `POST /v1/responses` - 生成响应
**限制:**
-**不支持** `previous_response_id` - 对话历史需要在客户端管理
- ✅ 基本响应生成完全可用
- ✅ 支持流式响应
**示例请求:**
```go
import (
"context"
"fmt"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
"github.com/openai/openai-go/v3/responses"
"github.com/openai/openai-go/v3/shared"
)
// 使用 AxonHub 配置创建 OpenAI 客户端
client := openai.NewClient(
option.WithAPIKey("your-axonhub-api-key"),
option.WithBaseURL("http://localhost:8090/v1"),
)
ctx := context.Background()
// 生成响应(不支持 previous_response_id)
params := responses.ResponseNewParams{
Model: shared.ResponsesModel("gpt-4o"),
Input: responses.ResponseNewParamsInputUnion{
OfString: openai.String("你好,最近怎么样?"),
},
}
response, err := client.Responses.New(ctx, params,
option.WithHeader("AH-Trace-Id", "trace-example-123"),
option.WithHeader("AH-Thread-Id", "thread-example-abc"))
if err != nil {
panic(err)
}
fmt.Println(response.OutputText())
```
**示例:流式响应**
```go
import (
"context"
"fmt"
"strings"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
"github.com/openai/openai-go/v3/responses"
"github.com/openai/openai-go/v3/shared"
)
client := openai.NewClient(
option.WithAPIKey("your-axonhub-api-key"),
option.WithBaseURL("http://localhost:8090/v1"),
)
ctx := context.Background()
params := responses.ResponseNewParams{
Model: shared.ResponsesModel("gpt-4o"),
Input: responses.ResponseNewParamsInputUnion{
OfString: openai.String("给我讲一个关于机器人的短故事。"),
},
}
stream := client.Responses.NewStreaming(ctx, params,
option.WithHeader("AH-Trace-Id", "trace-example-123"),
option.WithHeader("AH-Thread-Id", "thread-example-abc"))
var fullContent strings.Builder
for stream.Next() {
event := stream.Current()
if event.Type == "response.output_text.delta" && event.Delta != "" {
fullContent.WriteString(event.Delta)
fmt.Print(event.Delta) // 边传输边打印
}
}
if err := stream.Err(); err != nil {
panic(err)
}
fmt.Println("\n完整响应:", fullContent.String())
```
## API 转换能力
AxonHub 自动在 API 格式之间进行转换,实现以下强大场景:
### 使用 OpenAI SDK 调用 Anthropic 模型
```go
// OpenAI SDK 调用 Anthropic 模型
completion, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage("请解释什么是机器学习"),
},
Model: openai.ChatModel("claude-3-5-sonnet"), // Anthropic 模型
})
// 访问响应
responseText := completion.Choices[0].Message.Content
fmt.Println(responseText)
// AxonHub 自动转换 OpenAI 格式 → Anthropic 格式
```
### 使用 OpenAI SDK 调用 Gemini 模型
```go
// OpenAI SDK 调用 Gemini 模型
completion, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage("解释神经网络"),
},
Model: openai.ChatModel("gemini-2.5"), // Gemini 模型
})
// 访问响应
responseText := completion.Choices[0].Message.Content
fmt.Println(responseText)
// AxonHub 自动转换 OpenAI 格式 → Gemini 格式
```
## 嵌入 API
AxonHub 通过 OpenAI 兼容 API 提供全面的文本和多模态嵌入生成支持。
**端点:**
- `POST /v1/embeddings` - OpenAI 兼容嵌入 API
**支持的输入类型:**
- 单个文本字符串
- 文本字符串数组
- 令牌数组(整数)
- 多个令牌数组
**支持的编码格式:**
- `float` - 默认,返回嵌入向量为浮点数组
- `base64` - 返回嵌入为 base64 编码字符串
### 请求格式
```json
{
"input": "要嵌入的文本",
"model": "text-embedding-3-small",
"encoding_format": "float",
"dimensions": 1536,
"user": "user-id"
}
```
**参数:**
| 参数 | 类型 | 必需 | 描述 |
|------|------|------|------|
| `input` | string \| string[] \| number[] \| number[][] | ✅ | 要嵌入的文本。可以是单个字符串、字符串数组、令牌数组或多个令牌数组。 |
| `model` | string | ✅ | 用于嵌入生成的模型。 |
| `encoding_format` | string | ❌ | 返回嵌入的格式。可以是 `float``base64`。默认:`float`。 |
| `dimensions` | integer | ❌ | 输出嵌入的维度数。 |
| `user` | string | ❌ | 最终用户的唯一标识符。 |
### 响应格式
```json
{
"object": "list",
"data": [
{
"object": "embedding",
"embedding": [0.123, 0.456, ...],
"index": 0
}
],
"model": "text-embedding-3-small",
"usage": {
"prompt_tokens": 4,
"total_tokens": 4
}
}
```
### 示例
**OpenAI SDK (Python):**
```python
import openai
client = openai.OpenAI(
api_key="your-axonhub-api-key",
base_url="http://localhost:8090/v1"
)
response = client.embeddings.create(
input="你好,世界!",
model="text-embedding-3-small"
)
print(response.data[0].embedding[:5]) # 前 5 个维度
```
**OpenAI SDK (Go):**
```go
package main
import (
"context"
"fmt"
"log"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
)
func main() {
client := openai.NewClient(
option.WithAPIKey("your-axonhub-api-key"),
option.WithBaseURL("http://localhost:8090/v1"),
)
embedding, err := client.Embeddings.New(context.TODO(), openai.EmbeddingNewParams{
Input: openai.Union[string](openai.String("你好,世界!")),
Model: openai.String("text-embedding-3-small"),
option.WithHeader("AH-Trace-Id", "trace-example-123"),
option.WithHeader("AH-Thread-Id", "thread-example-abc"),
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("嵌入维度: %d\n", len(embedding.Data[0].Embedding))
fmt.Printf("前 5 个值: %v\n", embedding.Data[0].Embedding[:5])
}
```
**多个文本:**
```python
response = client.embeddings.create(
input=["你好,世界!", "你好吗?"],
model="text-embedding-3-small"
)
for i, data in enumerate(response.data):
print(f"文本 {i}: {data.embedding[:3]}...")
```
## 模型 API
AxonHub 提供增强的 `/v1/models` 端点,可列出可用模型并选择性地显示扩展元数据。
### 支持的端点
**端点:**
- `GET /v1/models` - 列出可用模型
### 查询参数
| 参数 | 类型 | 必填 | 描述 |
|-----------|------|----------|-------------|
| `include` | 字符串 | ❌ | 要包含的字段列表,以逗号分隔,或使用 "all" 包含所有扩展字段 |
### 可用字段
| 字段 | 类型 | 描述 |
|-------|------|-------------|
| `name` | 字符串 | 模型的显示名称 |
| `description` | 字符串 | 模型描述 |
| `context_length` | 整数 | 最大上下文长度(以令牌计) |
| `max_output_tokens` | 整数 | 最大输出令牌数 |
| `capabilities` | 对象 | 模型能力(vision, tool_call, reasoning) |
| `pricing` | 对象 | 定价信息(input, output, cache_read, cache_write) |
| `icon` | 字符串 | 模型图标 URL |
| `type` | 字符串 | 模型类型(chat, embedding, image, rerank, moderation, tts, stt) |
### 响应格式(基础 - 默认)
调用时不带 `include` 参数,端点仅返回基础字段:
```json
{
"object": "list",
"data": [
{
"id": "gpt-4",
"object": "model",
"created": 1686935002,
"owned_by": "openai"
}
]
}
```
**字段:**
- `id` - 模型标识符
- `object` - 始终为 "model"
- `created` - 模型创建的 Unix 时间戳
- `owned_by` - 拥有该模型的组织
### 响应格式(扩展)
使用 `?include=all` 或选择字段时,响应包含扩展元数据:
```json
{
"object": "list",
"data": [
{
"id": "gpt-4",
"object": "model",
"created": 1686935002,
"owned_by": "openai",
"name": "GPT-4",
"description": "GPT-4 model with advanced reasoning capabilities",
"context_length": 8192,
"max_output_tokens": 4096,
"capabilities": {
"vision": false,
"tool_call": true,
"reasoning": true
},
"pricing": {
"input": 30.0,
"output": 60.0,
"cache_read": 15.0,
"cache_write": 30.0,
"unit": "per_1m_tokens",
"currency": "USD"
},
"icon": "https://example.com/icon.png",
"type": "chat"
}
]
}
```
**扩展字段:**
- `name` - 人类可读的模型名称
- `description` - 详细的模型描述
- `context_length` - 上下文窗口的最大令牌数
- `max_output_tokens` - 响应中的最大令牌数
- `capabilities` - 包含布尔标志的对象:
- `vision` - 支持图像输入
- `tool_call` - 支持函数调用
- `reasoning` - 支持高级推理
- `pricing` - 包含定价详情的对象:
- `input` - 每 100 万令牌的输入价格
- `output` - 每 100 万令牌的输出价格
- `cache_read` - 每 100 万令牌的缓存读取价格
- `cache_write` - 每 100 万令牌的缓存写入价格
- `unit` - 始终为 "per_1m_tokens"
- `currency` - 始终为 "USD"
- `icon` - 模型图标图像的 URL
- `type` - 模型类别(chat, embedding, image, rerank, moderation, tts, stt)
### 示例
**基础请求(默认):**
```bash
curl -s http://localhost:8090/v1/models \
-H "Authorization: Bearer your-api-key" | jq
```
**包含所有扩展字段:**
```bash
curl -s "http://localhost:8090/v1/models?include=all" \
-H "Authorization: Bearer your-api-key" | jq
```
**仅选择字段:**
```bash
curl -s "http://localhost:8090/v1/models?include=name,pricing" \
-H "Authorization: Bearer your-api-key" | jq
```
**OpenAI SDK(Python):**
```python
import openai
client = openai.OpenAI(
api_key="your-axonhub-api-key",
base_url="http://localhost:8090/v1"
)
# 获取带扩展元数据的模型
models = client.models.list()
for model in models.data:
print(f"Model: {model.id}")
# 如果可用,访问扩展字段
if hasattr(model, 'name'):
print(f" Name: {model.name}")
if hasattr(model, 'pricing'):
print(f" Input price: ${model.pricing.input}/1M tokens")
```
### 错误响应
**401 未授权 - API 密钥无效:**
```json
{
"error": {
"message": "Invalid API key",
"type": "invalid_request_error",
"code": "invalid_api_key"
}
}
```
**500 内部服务器错误:**
```json
{
"error": {
"message": "Internal server error",
"type": "internal_error",
"code": "internal_error"
}
}
```
### 字段可用性说明
> **注意:** 扩展字段仅在模型配置了 ModelCard 数据时才会填充。没有 ModelCard 数据的模型将为扩展字段返回 `null`。
## 认证
OpenAI API 格式使用 Bearer 令牌认证:
- **头部**`Authorization: Bearer <your-api-key>`
API 密钥通过 AxonHub 的 API 密钥管理系统进行管理。
## 流式支持
OpenAI API 格式支持流式响应:
```go
// OpenAI SDK 流式传输
completion, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage("写一篇关于人工智能的短篇故事"),
},
Model: openai.ChatModel("claude-3-5-sonnet"),
Stream: openai.Bool(true),
})
if err != nil {
panic(err)
}
// 遍历流式数据块
for completion.Next() {
chunk := completion.Current()
if len(chunk.Choices) > 0 && chunk.Choices[0].Delta.Content != "" {
fmt.Print(chunk.Choices[0].Delta.Content)
}
}
if err := completion.Err(); err != nil {
panic(err)
}
```
## 错误处理
OpenAI 格式错误响应:
```json
{
"error": {
"message": "Invalid API key",
"type": "invalid_request_error",
"code": "invalid_api_key"
}
}
```
## 工具支持
AxonHub 通过 OpenAI API 格式支持**函数工具**(自定义函数调用)。但是,**不支持**各提供商特有的工具:
| 工具类型 | 支持状态 | 说明 |
| -------- | -------- | ---- |
| **函数工具(Function Tools)** | ✅ 支持 | 自定义函数定义可跨所有提供商使用 |
| **网页搜索(Web Search)** | ❌ 不支持 | 提供商特有功能(OpenAI、Anthropic 等) |
| **代码解释器(Code Interpreter)** | ❌ 不支持 | 提供商特有功能(OpenAI、Anthropic 等) |
| **文件搜索(File Search)** | ❌ 不支持 | 提供商特有功能 |
| **计算机使用(Computer Use)** | ❌ 不支持 | Anthropic 特有功能 |
> **注意**:仅支持可跨提供商转换的通用函数工具。网页搜索、代码解释器、计算机使用等提供商特有工具需要直接访问提供商的基础设施,无法通过 AxonHub 代理。
## 最佳实践
1. **使用追踪头部**:包含 `AH-Trace-Id``AH-Thread-Id` 头部以获得更好的可观测性
2. **模型选择**:在请求中明确指定目标模型
3. **错误处理**:为 API 响应实现适当的错误处理
4. **流式处理**:对于长响应使用流式处理以获得更好的用户体验
5. **使用函数工具**:进行工具调用时,请使用通用函数工具而非提供商特有工具
## 迁移指南
### 从 OpenAI 迁移到 AxonHub
```go
// 之前:直接 OpenAI
client := openai.NewClient(
option.WithAPIKey("openai-key"),
)
// 之后:使用 OpenAI API 的 AxonHub
client := openai.NewClient(
option.WithAPIKey("axonhub-api-key"),
option.WithBaseURL("http://localhost:8090/v1"),
)
// 您的现有代码继续工作!
```