PetAgent/docs/API_Documentation.md

477 lines
8.3 KiB
Markdown
Raw Normal View History

2026-04-12 11:32:37 +08:00
# 云屋平台 - API文档
**版本:** 3.0
**基础URL:** `https://api.yourdomain.com/api/v1``http://localhost:8000/api/v1` (开发环境)
## 概述
AI宠物伴侣平台API提供用户认证、聊天交互、背景管理、宠物配置和管理功能的端点。所有API端点遵循RESTful约定并返回JSON响应。
## 认证
大多数端点需要通过JWTJSON网络令牌进行认证。在Authorization头中包含令牌
```
Authorization: Bearer <jwt_token>
```
## 错误处理
所有错误响应都遵循此格式:
```json
{
"detail": "错误消息"
}
```
## 端点
### 用户管理
#### POST `/user/register`
注册新用户。
**请求体:**
```json
{
"phone": "字符串",
"password": "字符串",
"nickname": "字符串",
"openid": "字符串 (可选)"
}
```
**响应:**
```json
{
"access_token": "字符串",
"refresh_token": "字符串",
"user": {
"id": "数字",
"uid": "字符串",
"nickname": "字符串",
"avatar": "字符串",
"phone": "字符串"
}
}
```
#### POST `/user/login`
认证用户并返回令牌。
**请求体:**
```json
{
"phone": "字符串",
"password": "字符串"
}
```
**响应:**
```json
{
"access_token": "字符串",
"refresh_token": "字符串",
"user": {
"id": "数字",
"uid": "字符串",
"nickname": "字符串",
"avatar": "字符串",
"phone": "字符串"
}
}
```
#### POST `/user/wechat_login`
使用微信OAuth登录。
**请求体:**
```json
{
"code": "字符串"
}
```
**响应:**
```json
{
"access_token": "字符串",
"refresh_token": "字符串",
"user": {
"id": "数字",
"uid": "字符串",
"nickname": "字符串",
"avatar": "字符串",
"phone": "字符串"
}
}
```
#### GET `/user/profile`
获取当前用户资料。
**响应:**
```json
{
"id": "数字",
"uid": "字符串",
"nickname": "字符串",
"avatar": "字符串",
"phone": "字符串",
"status": "数字",
"created_at": "日期时间"
}
```
#### PUT `/user/profile`
更新用户资料。
**请求体:**
```json
{
"nickname": "字符串 (可选)",
"avatar": "字符串 (可选)"
}
```
**响应:**
```json
{
"id": "数字",
"uid": "字符串",
"nickname": "字符串",
"avatar": "字符串",
"phone": "字符串",
"status": "数字",
"updated_at": "日期时间"
}
```
### 背景管理
#### GET `/background/list`
获取用户可用背景列表。
**查询参数:**
- `visibility` (可选): 按可见性过滤 (1=公开, 2=私有, 3=VIP)
- `page` (可选): 页码 (默认: 1)
- `size` (可选): 页面大小 (默认: 20)
**响应:**
```json
{
"data": [
{
"id": "数字",
"name": "字符串",
"resource_url": "字符串",
"resource_type": "数字",
"visibility": "数字",
"bgm_url": "字符串",
"is_locked": "布尔值",
"lock_desc": "字符串",
"price_points": "数字",
"is_owned": "布尔值",
"is_default": "布尔值"
}
],
"total": "数字",
"page": "数字",
"size": "数字"
}
```
#### GET `/background/detail/{background_id}`
获取特定背景的详细信息。
**响应:**
```json
{
"id": "数字",
"name": "字符串",
"resource_url": "字符串",
"resource_type": "数字",
"visibility": "数字",
"bgm_url": "字符串",
"is_locked": "布尔值",
"lock_desc": "字符串",
"price_points": "数字",
"pets": [
{
"id": "数字",
"name": "字符串",
"avatar": "字符串",
"coordinate_x": "字符串",
"coordinate_y": "字符串",
"scale": "字符串",
"scene_prompt": "字符串",
"hello_message": "字符串"
}
]
}
```
#### POST `/background/purchase`
购买锁定的背景。
**请求体:**
```json
{
"background_id": "数字"
}
```
**响应:**
```json
{
"success": "布尔值",
"message": "字符串"
}
```
### 宠物管理
#### GET `/pet/list`
获取当前背景中可用的宠物列表。
**查询参数:**
- `background_id`: 背景ID
**响应:**
```json
{
"data": [
{
"id": "数字",
"name": "字符串",
"avatar": "字符串",
"global_prompt": "字符串",
"tts_voice_id": "字符串",
"tts_speed": "字符串",
"tts_volume": "字符串",
"coordinate_x": "字符串",
"coordinate_y": "字符串",
"scale": "字符串",
"scene_prompt": "字符串",
"hello_message": "字符串"
}
]
}
```
#### GET `/pet/detail/{pet_id}`
获取特定宠物的详细信息。
**响应:**
```json
{
"id": "数字",
"name": "字符串",
"avatar": "字符串",
"global_prompt": "字符串",
"tts_voice_id": "字符串",
"tts_speed": "字符串",
"tts_volume": "字符串",
"status": "数字"
}
```
### 聊天管理
#### POST `/chat/send`
向AI宠物发送消息。
**请求体:**
```json
{
"message": "字符串",
"pet_id": "数字",
"background_id": "数字",
"conversation_id": "字符串 (可选)"
}
```
**响应:**
```json
{
"response": "字符串",
"conversation_id": "字符串",
"tokens_used": {
"input": "数字",
"output": "数字"
}
}
```
#### GET `/chat/history`
获取对话的聊天历史记录。
**查询参数:**
- `conversation_id`: 对话ID
- `page` (可选): 页码 (默认: 1)
- `size` (可选): 页面大小 (默认: 20)
**响应:**
```json
{
"data": [
{
"id": "数字",
"user_msg": "字符串",
"ai_msg": "字符串",
"created_at": "日期时间"
}
],
"total": "数字",
"page": "数字",
"size": "数字"
}
```
#### POST `/chat/audio_stream`
发送音频流进行实时处理需要WebSocket连接
**WebSocket端点** `/ws/audio/{user_id}`
**消息格式:**
```json
{
"type": "audio_data | end_of_speech",
"data": "二进制音频数据 | null",
"timestamp": "ISO字符串"
}
```
### 管理功能
#### GET `/admin/users`
获取用户列表(仅管理员)。
**查询参数:**
- `status` (可选): 按状态过滤
- `page` (可选): 页码 (默认: 1)
- `size` (可选): 页面大小 (默认: 20)
**响应:**
```json
{
"data": [
{
"id": "数字",
"uid": "字符串",
"nickname": "字符串",
"avatar": "字符串",
"phone": "字符串",
"status": "数字",
"created_at": "日期时间"
}
],
"total": "数字",
"page": "数字",
"size": "数字"
}
```
#### PUT `/admin/user/{user_id}/status`
更新用户状态(仅管理员)。
**请求体:**
```json
{
"status": "数字 (1=激活, 2=禁止登录, 3=禁止发言)"
}
```
**响应:**
```json
{
"success": "布尔值",
"message": "字符串"
}
```
#### GET `/admin/chat_logs`
获取聊天日志(仅管理员)。
**查询参数:**
- `user_id` (可选): 按用户ID过滤
- `pet_id` (可选): 按宠物ID过滤
- `start_date` (可选): 按开始日期过滤
- `end_date` (可选): 按结束日期过滤
- `page` (可选): 页码 (默认: 1)
- `size` (可选): 页面大小 (默认: 20)
**响应:**
```json
{
"data": [
{
"id": "数字",
"user_id": "数字",
"trace_id": "字符串",
"pet_id": "数字",
"bg_id": "数字",
"user_msg": "字符串",
"ai_msg": "字符串",
"tokens_input": "数字",
"tokens_output": "数字",
"duration_ms": "数字",
"conversation_id": "字符串",
"created_at": "日期时间"
}
],
"total": "数字",
"page": "数字",
"size": "数字"
}
```
#### PUT `/admin/quota/gift`
向用户赠送配额(仅管理员)。
**请求体:**
```json
{
"user_id": "数字",
"amount": "数字"
}
```
**响应:**
```json
{
"success": "布尔值",
"message": "字符串"
}
```
## WebSocket连接
### 音频流
端点:`ws://localhost:8000/ws/audio/{user_id}`
用于与ASR和TTS服务进行实时音频处理。该连接支持双向音频流实现无缝语音对话。
## 速率限制
- 未认证端点每小时每个IP 100个请求
- 已认证端点:每小时每个用户 1000个请求
- 音频处理:每小时每个用户 50个请求
## 响应代码
- `200`: 成功
- `400`: 错误请求
- `401`: 未授权
- `403`: 禁止访问
- `404`: 未找到
- `422`: 验证错误
- `429`: 超出速率限制
- `500`: 内部服务器错误
## 附加资源
- [数据库模式](./database_schema.sql)
- [前端仓库](../frontend/)
- [后端仓库](../backend/)